使用Autofac解决继承类的依赖关系

时间:2015-10-19 16:01:26

标签: c# dependency-injection autofac

首先,让我提供一些示例代码:

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>

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我设法用这个注册来解决问题:

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

任何人都可以确认,这是正确的方法吗?