有条件地选择具有结构映射的DataContext

本文关键字:映射 DataContext 结构 选择 有条件 | 更新日期: 2023-09-27 18:29:36

我已经建立了一个新的MVC项目,我正在使用structuremap来处理我的DI/IoC。我正在使用实体框架和缓存存储库,以及存储库类和EF数据上下文。

因此,(简化)我有一个IRepository,它是由混凝土实现的-CacheRepositoryEFRepositoryFRepository依赖于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>();

有条件地选择具有结构映射的DataContext

如果不了解架构的全貌,很难回答,但您可能可以这样做(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的地方,而您的控制器不必了解实体框架。