2014-11-08 88 views
1

我已成立了一個新的MVC項目一個DataContext,而我使用structuremap來處理我的DI/IoC的。我正在使用實體框架和緩存存儲庫,存儲庫類和EF數據上下文。有條件選擇具有structuremap

所以,(簡化的)我有一個IRepository其由混凝土實現 - CacheRepositoryEFRepositoryEFRepository取決於DataContext的(的DbContext)和CacheRepository取決於IRepository(作爲持久性存儲庫回退),並ICachingService(所以我可以選擇我的緩存提供商),然後IService通過服務其取決於許多庫來實現的。

我的問題是,根據該網站的區域記錄到(例如管理員有一個單獨的登錄數據庫 - 這是一個原因,我不會進入這裏所做的)我的登錄信息數據庫是不同的。我有一個包含所有用戶表的基礎數據上下文,並從兩個主要的數據上下文繼承;所以根據用戶嘗試登錄的站點區域,決定檢查哪個數據庫的細節 - 所以我需要能夠根據控制器選擇datacontext或連接字符串。

有人能爲我提供一些指導如何實現的datacontext該條件選擇/ ConnectionString的基於控制器上所用structuremap實例?

我的IoC註冊表目前看起來是這樣的(引用datacontexts之一):

 For<BaseDataContext>().LifecycleIs<HttpContextLifecycle>() 
     .Use(x => new AdminDataContext()); 

     //REPOSITORIES 
     For<IDAL.Repositories.Users.IApplicationUserRepository>() 
      .Use<DAL.Repositories.Users.EFApplicationUserRepository>(); 

     For<IDAL.Repositories.Users.IUserLoginAttemptRepository>() 
      .Use<DAL.Repositories.Users.EFUserLoginAttemptRepository>(); 

     For<IDAL.Repositories.Users.IUserRoleRepository>() 
      .Use<DAL.Repositories.Users.CacheRoleRepository>() 
      .Ctor<IDAL.Repositories.Users.IUserRoleRepository>() 
      .Is<DAL.Repositories.Users.EFUserRoleRepository>() 
      .Ctor<IDAL.Caching.IGenericCachingService<Common.Objects.Data.Users.UserRole>>() 
      .Is<DAL.Caching.HttpContextGenericCachingService<Common.Objects.Data.Users.UserRole>>(); 

     //SERVICES 
     For<IBLL.Services.IUserService>() 
      .Use<BLL.Services.UserService>(); 
+0

這有什麼好運氣? – 2014-12-22 19:13:21

+0

@ Javid_p84,到目前爲止沒有任何想法?乾杯。 – Carl 2014-12-29 09:51:11

+0

不是真的。我添加了幾個虛擬接口來克服它。有趣的是,迄今爲止還沒有解決方案(或者至少我們不知道)。 – 2014-12-30 17:14:35

回答

0

很難回答沒有看到你的架構的大局觀,但你也許可以做這樣的事情(其中SomeService代表您的業​​務邏輯層):

public class MyController : Controller { 
    private ISomeService someService; 

    public MyController(ISomeService someService){ 
     this.someService = someService; 
    } 
} 

public class SomeService : ISomeService { 
    private SomeContext context; 

    public SomeService(SomeContext context){ 
     this.context = context; 
    } 
} 

這裏沒什麼特別 - 只是標準的構造函數注入。在您的控制器和實體框架之間擁有該業務邏輯層是一種很好的做法,併爲您提供了一個注入正確的DbContext的位置,而無需您的控制器知道實體框架。

+0

我已經擁有的DbContext,Irepository和Iservice一個DI模式,使用IoC容器 - 我的問題是傳遞給我的信息庫可以根據從哪個區域在系統中,它實例化是相同的服務和存儲庫不同的DataContext的。我的IoC容器如何做出這樣的決定?即如何使控制器/名稱空間等成爲IoC註冊中心的數據上下文實例化選擇的一個因素? – Carl 2014-11-20 13:30:37

+0

你可能會用控制器/命名空間指定它來咆哮錯誤的樹。我演示的模式應該可以正常工作 - 只需在構造函數中添加多個上下文(Context1 context1,Context2 context2等)。現在,如果你使用更重要的是,可以使用不同的背景之上的通用信息庫,你應該重構你的回購所以,它需要一個泛型類型IRepository 其中C:的DbContext。然後附加我已經在這裏展示的內容,而不是ISomeService,它將是ISomeService 。 – 2014-11-20 13:42:02