TornLifestyle简单的注射器

时间:2016-04-26 19:47:15

标签: c# generics simple-injector

我已经定义了这样的通用接口:

public interface IPlanManagmentRepository<TEntity> where TEntity:class

当我定义这样的具体实现时:

public class ProviderPlanManagementRepo : IPlanManagmentRepository<Provider>

一切都可以通过注册这样的界面来实现:

container.Register(typeof(IPlanManagmentRepository<>), 
    new [] { typeof(IPlanManagmentRepository<>).Assembly}, 
    Lifestyle.Scoped);

但是,如果这个类也处理更多的东西,我添加了一个额外的接口:

public interface IProviderPlanManagementRepo
{
    void doSomethingSpecificToProviderHere();
}
public class ProviderPlanManagementRepo : IProviderPlanManagementRepo,
    IPlanManagmentRepository<Provider>
{
}

然后我收到此错误:

  

- [Torn Lifestyle] IPlanManagmentRepository的注册映射到与IProviderPlanManagementRepo注册相同的实现和生活方式。它们都映射到ProviderPlanManagementRepo

我还试图在IProviderPlanManagementRepo中继承IPlanManagmentRepository,但也遇到了同样的错误。

此类是否只处理通用接口的实现? 或者可以通过简单的喷射器实现这一目标吗?

1 个答案:

答案 0 :(得分:3)

您的问题与此work itemthis discussion有关。通常,撕裂的生活方式可以固定as follows,但是当使用批量注册注册具有多个不相关接口的类型时,Simple Injector 3.1会非常难以修复违规。这是我们将在即将发布的一个小版本中解决的问题。

我现在可以推荐的最简单的修复方法是让您的IPlanManagmentRepository<T>注册成为暂时的。你应该能够使它们成为瞬态的,因为你的组件应该是任何方式都是不可变的。因此通常只有DbContext应该是Scoped,但您甚至可能不希望将DbContext注入您的存储库,因为DbContext是运行时数据,运行时数据应该not be injected into the components of your object graph