使用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> .

谢谢你的帮助!

使用Autofac解析继承类的依赖项

我设法解决了这个注册的问题:

builder.RegisterGeneric(typeof(BaseStore<>))
       .As(typeof(IStore<>))
       .InstancePerRequest();
builder.RegisterAssemblyTypes(Assembly.Load("Project.Data"))
       .Where(t => t.Name.EndsWith("Store"))
       .AsImplementedInterfaces()
       .InstancePerRequest();

有谁能确认,这是正确的方式吗?