Laden...

Gibt es beim SimpleContainer einen LifeTimeScope wie bei Autofac?

Erstellt von Moritz83 vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.532 Views
M
Moritz83 Themenstarter:in
50 Beiträge seit 2013
vor 4 Jahren
Gibt es beim SimpleContainer einen LifeTimeScope wie bei Autofac?

Moin,

ich habe in meinem ersten Projekt Autofac integriert:

public static IContainer Configure()
{
var builder = new ContainerBuilder();
builder.RegisterType<DbContext>().As<IDbContext>();
builder.RegisterType<EmployeeRepository>().As<IEmployeeRepository>();
builder.RegisterType<DepartmentRepository>().As<IDepartmentRepository>();
return builder.Build();
}

und dann so eingebunden

var container = ContainerConfig.Configure();
using (var scope = container.BeginLifetimeScope())
{
var test = scope.Resolve<IDepartmentRepository>();
dept = test.GetById(DepartmentFK);
}

dies klappt auch soweit, allerdings schaue ich mir gerade anhand meines ersten Projekts "Caliburn.Micro" an und dachte mir das ich auch gleich den dort inegrierten "SimpleContainer" nutzen könnte. Ich habe den Bootstrapper bereits erstellt und der Teil mit dem Container sieht so aus:

private SimpleContainer _container = new SimpleContainer();
protected override void Configure()
        {
            _container.Instance(_container);

_container
.Singleton<IWindowManager, WindowManager>()
.Singleton<IEventAggregator, EventAggregator>()
.Singleton<IDbContext, DbContext>()
.Singleton<IDepartmentRepository, DepartmentRepository>();

GetType().Assembly.GetTypes()
.Where(type => type.IsClass)
.Where(type => type.Name.EndsWith("ViewModel"))
.ToList()
.ForEach(viewModelType => _container.RegisterPerRequest(
viewModelType, viewModelType.ToString(), viewModelType));
}

Sodele, wenn ich nun folgendes mache:

public class Test
{
private readonly IDepartmentRepository _dep;
public Test(IDepartmentRepository Dep)
{
_dep = Dep;
}

public DepartmentEntity teststuff()
{
var test = _dep.GetById(MyId);
return test;
}
}

sollte ich ja schlussendlich das Gleiche kriegen, allerdings bedingt durch das fehlende Using bleibt der Container offen (wenn ich das richtig verstanden habe). Wie kann ich das mit SimpleContainer erreichen?

16.806 Beiträge seit 2008
vor 4 Jahren

IIRC hat der SimpleContainer im Gegensatz zu anderen Lösungen kein Lifetime Management; damit auch keine managed Lösung für Dein Problem.
Andere Lösungen haben ein sogenanntes Automatic Disposal auf Basis von IDispose.

M
Moritz83 Themenstarter:in
50 Beiträge seit 2013
vor 4 Jahren

Was würdest du mir raten? Back to Autofac oder eherwas anderes?

16.806 Beiträge seit 2008
vor 4 Jahren

Ich rate Dir: evaluier die Komponenten, bevor Du anfängst - das ist prinzipiell als Entwickler Dein Job 😃
Mach Dir zur Not ein einfaches Excel auf, schau nach, welche Features Du unbedingt benötigst und dann such nach entsprechenden Komponenten, die dazu passen.
Es gibt zig solcher Komponenten. Nur weil was für mich passt, heisst das nicht, dass es für Dich passt.

Ja, vermutlich wirst Du auch das ein oder andere Requirement vergessen: aber da lernt man einfach dazu.

PS: von Microsoft gibt es seit längerem ein eigenes Dependency Injection "Framework": Microsoft.Extensions.DependencyInjection
Wird in einigen WPF mit .NET Core Tutorials verwendet; wird aber für Framework genauso sein Dienst verrichten (sofern die entsprechende .NET Standard Version matched).

2.078 Beiträge seit 2012
vor 4 Jahren

Ich stand Mal vor einer ähnlichen Suche und habe das gefunden:

http://featuretests.apphb.com/
https://www.palmmedia.de/Blog/2011/8/30/ioc-container-benchmark-performance-comparison

Auf der ersten Seite werden viele Frameworks im Bezug auf die Features verglichen.
Im zweiten Artikel werden einige Frameworks (größtenteils die Gleichen) im Bezug auf Performance verglichen.