2014-11-08 71 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