我已经定义了这样的通用接口:
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,但也遇到了同样的错误。
此类是否只处理通用接口的实现? 或者可以通过简单的喷射器实现这一目标吗?
答案 0 :(得分:3)
您的问题与此work item和this discussion有关。通常,撕裂的生活方式可以固定as follows,但是当使用批量注册注册具有多个不相关接口的类型时,Simple Injector 3.1会非常难以修复违规。这是我们将在即将发布的一个小版本中解决的问题。
我现在可以推荐的最简单的修复方法是让您的IPlanManagmentRepository<T>
注册成为暂时的。你应该能够使它们成为瞬态的,因为你的组件应该是任何方式都是不可变的。因此通常只有DbContext
应该是Scoped
,但您甚至可能不希望将DbContext
注入您的存储库,因为DbContext
是运行时数据,运行时数据应该not be injected into the components of your object graph