/ / Jak wstrzyknąć dbcontext za pomocą StructureMap i WebApi2 - entity-framework, iniekcja zależności, asp.net-web-api2, structuremap, dbcontext

Jak wstrzyknąć dbcontext za pomocą StructureMap i WebApi2 - entity-framework, iniekcja zależności, asp.net-web-api2, structuremap, dbcontext

Chciałbym wprowadzić mój dbcontext do mojegousługi w projekcie web api 2. Ale nie jestem pewien, jak to zrobić. Przeczytałem przez docs, ale cykle życia, zakresy, żądania, zagnieżdżone pojemniki ... wszystkie one pozostawiają mnie trochę niepewne.Złożyłem następujący kod z mojego najlepszego zrozumienia.Po zainstalowaniu pakietu Nuget StructureMap.WebApi2, kontynuowałem aby zaktualizować SM z wersji V3 do wersji 4, a także wersję SM.MVC5 z wersji 3 do wersji 4.

Poniższy kod wydaje się mieć pożądanyefekt użycia jednego kontekstu dbcontext na żądanie http (myślę, że to jest to, czego chcę ... jestem tak zdezorientowany, jeśli chodzi o zakresy), aby ten sam dbcontext był wspólny dla wszystkich usług podczas transakcji użytkowników, a następnie usunięty, gdy transakcja ( żądanie http) jest zamknięty. Ale pozory nie zawsze są właściwe.

IoC.cs

    public static IContainer Initialize()
{
var container = new Container(_ =>
{
_.AddRegistry<DefaultRegistry>();
_.ForConcreteType<MyDbContext>().Configure.ContainerScoped();
});
DomainEvents.Initialize(container);
return container;
}}

DefaultRegistry.cs:

    public DefaultRegistry()
{
var mapperConfig = new MapperConfiguration(cfg =>
{
cfg.AddProfile(new Common.Map.MapProfile());
cfg.CreateMissingTypeMaps = true;
});
var mapper = mapperConfig.CreateMapper();
For<IMapper>().Use(() => mapperConfig.CreateMapper());
For<MyDbContext>().Use(()=> new MyDbContext());

Scan(
scan =>
{
scan.AssemblyContainingType<ServiceBase>();
scan.TheCallingAssembly();
scan.WithDefaultConventions();
scan.ConnectImplementationsToTypesClosing(typeof(IHandle<>));
});
}

Pakiet Nuget StructureMap.WebApi2 utworzył kilka innych plików służących do łączenia rozdzielczości i zagnieżdżonych kontenerów, ale pozostawiam je poza tym pytaniem ze względu na zwięzłość.

Odpowiedzi:

0 dla odpowiedzi № 1

Zobacz fabrykę / lokalizator Mehdime DbContext Scope: https://github.com/mehdime/DbContextScope i ma na swoim blogu trochę zaniedbania. (link w opisie projektu.) Są tam widelce zaktualizowane do najnowszych wersji EF.

Przekonałem się, że jest to doskonałe opakowanie jednostkowe pracy w kontekście EF, bez konieczności martwienia się o wstrzykiwanie lub przekazywanie bezpośrednio tych kontekstów.

Problem z kontenerami IoC i konstruktoremWstrzykiwanie polega na tym, że jeśli zarejestrujesz swój DBContext, oznacza to, że ciężko pracować z takimi jednostkami, jak jednostka pracy, w zakresie żądania, ale nie jest to w zasadzie cały zakres żądania. DbContext Scope rozwiązuje ten problem, rejestrując się Fabryka Zakresów i Lokalizator Zakresów w twoim Kontrole Kod kontrolujący Zakres (jednostka pracy) użyje Fabryki Zakresów do zainicjowania zakresu kontekstu dla twoich DbContexts Kod działający z DbSets itp. w DbContext użyj ContextScopeLocator, aby uzyskać ich UOW / w to DbContext i zestawy.