有条件地选择具有结构映射的DataContext
本文关键字:映射 DataContext 结构 选择 有条件 | 更新日期: 2023-09-27 18:29:36
我已经建立了一个新的MVC项目,我正在使用structuremap来处理我的DI/IoC。我正在使用实体框架和缓存存储库,以及存储库类和EF数据上下文。
因此,(简化)我有一个IRepository,它是由混凝土实现的-CacheRepository和EFRepositoryFRepository依赖于DataContext(DbContext),而CacheRepository则依赖IRepository,以及ICachingService,然后由依赖于多个存储库的Service实现IService。
我的问题是,我的登录数据库因登录到网站的哪个区域而异(例如,管理员有一个单独的登录数据库-这样做是因为我不想在这里详细介绍)。我有一个包含所有用户表的基本数据上下文,它是从两个主要数据上下文继承而来的;因此,根据用户试图登录到网站的哪个区域,决定检查哪个数据库的详细信息——所以我需要能够根据控制器选择数据上下文或连接字符串。
有人能为我提供一些指导吗?如何根据使用结构图实例化的控制器来实现数据上下文/连接字符串的条件选择?
我的IoC注册表当前如下(引用其中一个数据上下文):
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>();
如果不了解架构的全貌,很难回答,但您可能可以这样做(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的地方,而您的控制器不必了解实体框架。