使用Autofac解析继承类的依赖项
本文关键字:依赖 继承 Autofac 使用 | 更新日期: 2023-09-27 18:18:18
首先,让我提供一些示例代码:
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周围的所有基本内容(例如填充"LastModifiedBy"属性)。但在某些情况下,我需要特定的行为来保存实体,所以我需要从BaseStore
派生,并在MyCustomEntityStore
中实现自定义行为。到目前为止,还很容易。
问题是我想使用autofacc来解决我的应用程序中的依赖关系。我的目标是这样做:
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>
.
谢谢你的帮助!
我设法解决了这个注册的问题:
builder.RegisterGeneric(typeof(BaseStore<>))
.As(typeof(IStore<>))
.InstancePerRequest();
builder.RegisterAssemblyTypes(Assembly.Load("Project.Data"))
.Where(t => t.Name.EndsWith("Store"))
.AsImplementedInterfaces()
.InstancePerRequest();
有谁能确认,这是正确的方式吗?