繁体   English   中英

具有不同数据库,实体类型和dbcontext的通用存储库

[英]Generic Repository with different databases, entity types and dbcontext

我已按照此易于遵循的指南为asp.net Web api项目实现了一个简单的通用存储库:

http://www.dataworks.ie/blog/entity_framework_5_with_automapper_and_repository_pattern

很好

但是,我在开发中的解决方案有两个具有相同架构的简单数据库-用于测试/开发以及在本地(和脱机)运行时的SQL Server CE,以及​​在联机时运行的SQL Azure。 两者都有在单独的程序集中创建的EF层。 我通过上下文类的构造函数中的web.config连接字符串切换DbContext 问题出在我的控制器代码上。

例如,如果使用Azure,我将拥有

public ActionResult Index()
{
    IGenericRepository<MyProj.Data.SqlAzure.User> userRepo = new GenericRepository<MyProj.Data.SqlAzure.User>();

如果我使用的是SQL Server CE,我将拥有

public ActionResult Index()
{
    IGenericRepository<MyProj.Data.SqlCe.User> userRepo = new GenericRepository<MyProj.Data.SqlCe.User>();

因此,在切换数据库时,我必须手动更改为正确的程序集命名空间以引用我的实体。

很抱歉,如果这已经做完了,因为已经有一段时间没有做这些了,那么这种情况下最好的/优雅的解决方案是什么? 上面的看起来很脏。 另外,我所有的通用存储库代码当前都位于与Web应用程序相同名称空间的模型文件夹中。

由于您使用的是通用存储库,除非您告诉它,否则它将不知道如何确定所需的用户实体。

您可以做什么,创建一个可以为您解决问题的工厂。 GenericRepositorySqlAzure和GenericRepositorySqlCe

我想到的唯一解决方案是拥有一个工厂类,以使用配置文件中定义的开关来创建实例,例如

public DbRepositoryFactory
{    
    public IGenericRepository<User> GetUserRepository()
    {
        return ConfigurationManager.AppSettings["DbSwitch"].Equals("Azure")
            ? new GenericRepository<MyProj.Data.SqlAzure.User>()
            : new GenericRepository<MyProj.Data.SqlCe.User>()
    }
}

要么使用反射。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM