2015-10-19 161 views
0

首先,让我提供一些示例代码:解决依赖

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中实现自定义行为。到目前为止,这很容易。

问题是我想使用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>MyCustomEntityStoreIStore<MyCustomEntity>。这与MyCustomEntityStore(其具有从基本商店派生的具体实现)工作正常,但我不想创建空的类只是为了继承BaseStore<MyEntity>。我注册了我的部件是这样的:

builder.RegisterAssemblyTypes(Assembly.Load("Project.Data")).Where(t => t.Name.EndsWith("Store")).AsImplementedInterfaces().InstancePerRequest(); 

虽然这些实例可以在这些接口的地方,Autofac无法解决IStore<MyEntity>

感谢您的帮助!

回答

0

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

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

任何人都可以证实,这是正确的做法?