首先,让我提供一些示例代码:
public abstract class BaseEntity { }
public class MyEntity : BaseEntity { }
public class MyCustomEntity : BaseEntity { }
public interface IStore<TEntity> where TEntity : BaseEntity { }
public class BaseStore<TEntity> : IStore<TEntity> where TEntity : BaseEntity { }
public class MyCustomEntityStore : BaseStore<MyEntity> { }
所以基本上我有一个抽象实体和两个派生类型。我创建了一个存储库类,它隐藏了BaseEntity周围的所有基本内容(例如填充&#34; LastModifiedBy&#34;属性)。但在某些情况下,我需要特定的行为来保存实体,因此我需要从BaseStore
派生,并在MyCustomEntityStore
中实现自定义行为。到目前为止,这很容易。
问题是我想使用Autofac来解决我的应用程序中的依赖项。我的目标是这样做:
public class SomeClass {
private readonly IStore<MyEntity> MyEntityStore;
private readonly IStore<MyCustomEntity> MyCustomEntityStore;
public SomeClass(IStore<MyEntity> mes, IStore<MyCustomEntity> mces)
{
MyEntityStore = mes;
MyCustomEntityStore = mces;
}
}
我想向BaseStore<MyEntity>
和IStore<MyEntity>
注入一个MyCustomEntityStore
的实例到IStore<MyCustomEntity>
。这与MyCustomEntityStore
(具有从基本存储派生的具体实现)一起正常工作,但我不想仅仅为了继承BaseStore<MyEntity>
而创建空类。我注册了我的组件:
builder.RegisterAssemblyTypes(Assembly.Load("Project.Data")).Where(t => t.Name.EndsWith("Store")).AsImplementedInterfaces().InstancePerRequest();
虽然这些实例可以代替这些接口,但Autofac无法解析IStore<MyEntity>
。
感谢您的帮助!
答案 0 :(得分:0)
我设法用这个注册来解决问题:
builder.RegisterGeneric(typeof(BaseStore<>))
.As(typeof(IStore<>))
.InstancePerRequest();
builder.RegisterAssemblyTypes(Assembly.Load("Project.Data"))
.Where(t => t.Name.EndsWith("Store"))
.AsImplementedInterfaces()
.InstancePerRequest();
任何人都可以确认,这是正确的方法吗?