1

希望能夠提供一個關於使用Unity和依賴注入的快速問題。我瀏覽過stackoverflow和搜索引擎,但還沒有找到這是可能的。將Unity中的不同DbContext映射到存儲庫接口的不同實例

我實際上有兩個不同的dbcontexts和我想用於上下文的通用存儲庫。

public static void RegisterComponents() 
{ 
    var container = new UnityContainer(); 
    container.RegisterType<DbContext, DBContext1>(new PerResolveLifetimeManager()); 
    container.RegisterType(typeof(IRepository<>), typeof(Repository<>)); 

    container.RegisterType<DbContext, DBContext2>(new PerResolveLifetimeManager()); 
    container.RegisterType(typeof(IRepository<>), typeof(Repository<>)); 
    container.RegisterType<IUnitOfWork, UnitOfWork>(); 

    ...... 

    container.RegisterType<IGenderService, GenderService>(); 
    container.RegisterType<ILanguageService, LanguageService>(); 

    ....... 

    container.RegisterType<IPhotoService, PhotoService>(); 
} 

但是,當我調用IPhotoService時,Visual Studio會拋出一個錯誤,說模型(照片)不是上下文的一部分。這是由於Photo模型位於DBContext1中,但在代碼中稍後使用DBContext2覆蓋IRepository映射。

有沒有一種辦法:

  • 名這些不同的DbContext映射

  • 有兩個不同的IRepository映射到不同的DbContexts

  • 注入一個名爲IRepository映射到具體類例如照片服務?

感謝

+0

我不知道Unity,但在StructureMap中,您可以命名上下文以便您可以通過調用它來解析實現,如下所示:Container.Resolve ().Named(「ThisOne」) –

回答

0

發現了它,你可以註冊命名實例在Unity像這樣:

container.RegisterType<Type2>("Instance 1", new ContainerControlledLifetimeManager()); 
container.RegisterType<Type2>("Instance 2", new ContainerControlledLifetimeManager()); 

然後解決它同樣:

Type2 instance1 = container.Resolve<Type2>("Instance 1"); 
+0

感謝您的回覆佩德羅。我對如何實現這一點感到困惑 – user6008632

0
public static void RegisterComponents() 
    { 
     var container = new UnityContainer(); 
     container.RegisterType<DbContext, DBContext1>(new PerThreadLifetimeManager()); 
     container.RegisterType(typeof(IRepository<>), typeof(Repository<>)); 
     container.RegisterType<IUnitOfWork, UnitOfWork>(); 

     container.RegisterType<IRepository<Photo>, Repository<Photo>>(new PerThreadLifetimeManager(),new InjectionConstructor(new DBContext2())); 
     .... 
     container.RegisterType<IGenderService, GenderService>(); 
     container.RegisterType<ILanguageService, LanguageService>(); 
     .... 
     container.RegisterType<IPhotoService, PhotoService>(); 
     } 

好我使用這段代碼解決了這個問題,但並不確信這是最好的方式。

基本上IPhotoService使用需要DbContext2的IRepository。所以我在代碼中編寫了這個解析器,並且實際上將DbContext作爲一個可以工作的injectionConstructor傳遞。

DbContext1上下文與IGenderService,ILanguageService一樣可以像以前那樣工作。

0

單獨註冊上下文。

container.RegisterType<DbContext, DBContext1>(new PerThreadLifetimeManager()); 
container.RegisterType<DbContext2, DbContext2>(new PerThreadLifetimeManager()); 

然後在你的倉庫情況下,接受所有的各種DbContexts的:

public class Repository<T> 
{ 
    protected DbContext1 DbCtxt1 { get; } 
    protected DbContext2 DbCtxt2 { get; } 

    public Repository<T>(DbContext1 ctx1, DbContext2 ctx2) 
    { 
     DbCtxt1 = ctx1; 
     DbCtxt2 = ctx2; 
    } 
} 

然後你可以指定一個作爲默認,但在一般的倉庫,使你的T型構建一些邏輯重寫它。巨大的好處是,您可以從保存服務中訪問所有不同的上下文。

也許而不是純粹的泛型T,它必須是一個強制子類實現DbContext選擇器或者其他類型的接口。

相關問題