2016-05-17 38 views
0

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

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核心项目再现第二线(IUnitOfWork登记)与IServiceProvider。我不明白的是如何制作类似container.Resolve<IEventStoreUnitOfWork<IDomainEvent>>的东西。

+0

解决方法之一是从IEventStoreUnitOfWork 例如'MyDomain:IEventStoreUnitOfWork '继承一个类,然后在其上使用Resolve。 –

+0

@OrelEraki - 我正在处理遗留项目,我还不太明白,但是你的意思是让另一个类继承IEventStoreUnitOfWork ?那我怎么用呢? – alexxjk

+0

第二行应该是单身?或范围(请求寿命) – Tseng

回答

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 Cores Resolve方法)并返回已解析的类型。

+0

谢谢!我知道我的代码看起来有点奇怪,但正如我所提到的,这是一个遗留项目,我需要短期将其移至ASP.NET Core。您的解决方案正是我一直在寻找的! – alexxjk

+0

对,但不是第一行过时的第二行?我的意思是,当你解决'IUnitOfWork'时,你会得到与解析'IEventStoreUnitOfWork '**相同的**实例,所以'services.AddSingleton >();'应该导致相同, 对? – Tseng

+0

的确如此,但由于某些原因,项目中的某些服务使用IUnitOfWork接口和一些IEventStoreUnitOfWork 。但他们都依赖于同一个例子..我犹豫现在做任何改变。 – alexxjk