IOC/DI
Welche Container gibt es
Welchen Container wir wirklich verwenden sollten ;-)
Spring.net
DryIOC
Unity
spring.net oder einen anderen Container mit cooler ORM Integration
unity, autofac, ... auf jeden Fall kein Schwergewicht mit 1001 Funktion, die nicht benötigt wird.
<object id="ContractorCoachingViewModel"
type="Com.QueoFlow.TrackingtoolLogistik.WPF.Ui.UserControls.ContractorCoaching.ViewModels.ContractorCoachingViewModel, TrackingtoolLogistik.WPF"
singleton="false">
<property name="ProjectService"
ref="projectService" />
<property name="OrderImportService"
ref="orderImportService" />
<property name="ProjectReportService"
ref="projectReportService" />
<property name="SpecialPeriodService"
ref="specialPeriodService" />
public T Create<T>(params object[] arguments) where T : class {
IApplicationContext context = ContextRegistry.GetContext();
string typeName = typeof(T).Name;
typeName = typeName.Substring(0, 1).ToLower() + typeName.Substring(1);
T viewModel;
if (arguments.Length > 0) {
viewModel = context.GetObject(typeName, arguments) as T;
} else {
viewModel = context.GetObject(typeName) as T;
}
return viewModel;
}
Unser bisheriger Standardcontainer mit sehr guter NHibernate Integration und Transaction Management sowie sehr umfargreichen AOP Möglichkeiten.
var c = new Container();
c.Register<IClient, SomeClient>();
c.Register<IService, SomeService>();
// somewhere else
IClient client = c.Resolve<IClient>();
Ein sehr schneller Container, der teilweise in WPF Anwendungen eingesetzt wird, wenn keine weitere DB Anbindung notwendig ist und nur simples DI genötigt wird.
/* Alle in der Assembly, die ein gleichnamiges Interface haben
* als transient (neue Instanz pro resolve)
* https://msdn.microsoft.com/en-us/library/ff660872(v=pandp.20).aspx
*/
container.RegisterTypes(
AllClasses.FromAssemblies(typeof(UnityConfig).Assembly),
WithMappings.FromMatchingInterface,
WithName.Default, WithLifetime.Transient);
/* Nur einen einzelnen Typ inkl. Interface registrieren */
container.RegisterType<IMainViewModel, MainViewModel>();
/* https://github.com/roblevine/UnityLog4NetExtension */
container.AddNewExtension<Log4NetExtension>();
Etwas schwergewichtigerer Container von MS der in diversen WebApi und WPF Anwendungen eingesetzt, wenn keine weitere DB Anbindung benötigt wird.
/* Resolve from container */
ISomeService someService =
container.Resolve<ISomeService>();
/* Constructor injection */
public SomeClass(ISomeService someService){...}
/* Property injection */
[Dependency]
public ILog Logger { set; protected get; }
[AppSettingsDependency("ReadingAnalysis.DecimalPlaces")]
public int DecimalPlaces { get; set; }
Wiki Stichwort: DI-/IOC Container