繁体   English   中英

在转换为新供应商的过程中,如何有效地将一个应用程序映射到两个数据库后端?

[英]How can I effectively map one application to two database backends during a conversion to a new vendor?

好的。 我使用MVC3开始了一个新项目。 我已经从NuGet实现了EF4.1,Automapper,Ninject,PagedList。

我花了两天时间充实了我的模式,建立了IOC和接口。 我将我的服务注入我的控制器,将我的存储库注入我的服务,将我的DbContext注入我的存储库。

我剩下的是一个运行的应用程序,一切都很好。 我遇到的问题是我们正在改变代理商主要系统的供应商。 这意味着数据库结构将发生重大变化。

我是否正确创建ICamaContext的两个具体实现和ICamaRepository的两个具体实现? 每个数据库一个? 然后在每个存储库中,我将相应的dbsets映射到我的类型以匹配ICamaRepository中定义的契约?

我不确定这是否有意义。 换句话说,无论使用哪个DB后端,我都不想重写我的服务中的任何内容。

namespace search.Common.Repositories
{
    public interface ICamaRepository
    {
        IQueryable<Parcel> GetParcels();
    }

    public class AssessProCamaRepository : ICamaRepository
    {
        ICamaContext _db;

        public AssessProCamaRepository(ICamaContext dataContext)
        {
            _db = dataContext;
        }


        public IQueryable<Parcel> GetParcels()
        {
            return from c in _db.DataProperty
                   select new Parcel
                   {
                       AccountNumber = c.AccountNumber                      
                   };

        }
    }
}

这听起来像是一种合理的方法。 但是,由于数据库结构将发生重大变化,因此提出新旧数据库结构之间通用的存储库层可能具有挑战性。

此外,根据数据库的差异,您可能无法为所有存储库方法返回IQueryable。

我不认为在存储库中抽象dbContext会给你带来任何好处,事实上在存储库中使用抽象的数据层并没有多大意义。

IMO几乎不可能创建一个可以通过不同的数据访问技术(甚至不同的ORM)使用(可实现)的抽象层,因此抽象数据层只会增加更多无用的复杂性。 最后,我建议为每个存储库创建两个版本,一个用于新结构,另一个用于旧结构,然后您的DI单元决定使用正确的一个。

暂无
暂无

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

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