2015-10-19 252 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(); 

任何人都可以證實,這是正確的做法?