从IoCContainer迁移到IServiceProvider

时间:2016-05-17 15:58:26

标签: asp.net-core

我将API迁移到ASP.NET Core。在我的旧项目中,我有这样的服务注册:

public static void Register(HttpConfiguration config)
{
   ...

   var container = IoCContainer.Instance;

   container.RegisterType<IEventStoreUnitOfWork<IDomainEvent>, EventStoreUnitOfWork<IDomainEvent>>(new ContainerControlledLifetimeManager());
   container.RegisterInstance(typeof (IUnitOfWork), container.Resolve<IEventStoreUnitOfWork<IDomainEvent>>());

   ...
}

我无法弄清楚如何在ASP.NET Core项目中使用IServiceProvider重现第二行(IUnitOfWork注册)。我不明白的是如何制作像container.Resolve<IEventStoreUnitOfWork<IDomainEvent>>这样的东西。

1 个答案:

答案 0 :(得分:0)

我不太清楚我明白你的代码应该做什么(你的注册)。

这有点奇怪,因为你在第一行注册了一个单身,你似乎解决了它类似于第二行中的瞬态,但由于它被注册为单身,它总会返回相同。那么第二行应该做什么?

您在寻找工厂方法吗?

public static void Register(IServiceCollection services) 
{
    services.AddSingleton<IEventStoreUnitOfWork<IDomainEvent>,EventStoreUnitOfWork<IDomainEvent>>();
     // AddScoped = request-lifetime, AddTransint = instantiate on each resolve
     services.AddScoped<IUnitOfWork>( provider => provider.RequestService<IEventStoreUnitOfWork<IDomainEvent>>();
}

AddXxx方法的第二个重载允许您使用委托来提供工厂方法。传递给委托的参数将是IServiceProvider(它是从IServiceCollection构建后的容器),因此您可以调用RequestService(是ASP.NET内核)在其中的Resolve方法)并返回已解析的类型。