Я хотел бы внедрить свой dbcontext в свои службы в проекте web api 2. Но я немного не уверен, как это сделать. Я прочитал документацию, но жизненные циклы, области действия, запросы, вложенные контейнеры... все это оставляет меня немного неуверенным. Я собрал следующий код из моего лучшего понимания. После установки пакета Nuget StructureMap.WebApi2 я приступил к обновлению SM с версии 3 до версии 4, а также SM.MVC5 с версии 3 до версии 4.
Следующий код, по-видимому, имеет желаемый эффект использования одного dbcontext для каждого http-запроса (я думаю, это то, что я хочу... я так запутался в областях), чтобы один и тот же dbcontext использовался для всех служб во время транзакции пользователей, и затем удаляется, когда транзакция (http-запрос) закрывается. Но внешность не всегда правильная.
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<>));
});
}
Пакет Nuget StructureMap.WebApi2 создал несколько других файлов для подключения разрешения и вложенных контейнеров, но я не рассматриваю их в этом вопросе для краткости.