C# 使用DI重构DAL,能够在以后更改DAL

C# 使用DI重构DAL,能够在以后更改DAL,c#,.net,architecture,dependency-injection,refactoring,C#,.net,Architecture,Dependency Injection,Refactoring,我们目前拥有的是一个相对较旧的代码库,使用EntitySpace(其实不重要,但它是一个ORM,在过去很好使用,但根据我最近的EntityFramework经验,它不再是那么多了)作为ORM直接访问数据库。我现在面临着更改许多当前直接依赖EntitySpaces对象的应用程序的需要。这不好,但现在就是这样。 我的总体想法是引入一个层,该层引入中立的、不知道持久性的对象,编写某种类型的存储库接口来获取、更新这些对象,并编写(第一个)仍然使用EntitySpace的实现。然后我可以重构当前直接使用E

我们目前拥有的是一个相对较旧的代码库,使用EntitySpace(其实不重要,但它是一个ORM,在过去很好使用,但根据我最近的EntityFramework经验,它不再是那么多了)作为ORM直接访问数据库。我现在面临着更改许多当前直接依赖EntitySpaces对象的应用程序的需要。这不好,但现在就是这样。 我的总体想法是引入一个层,该层引入中立的、不知道持久性的对象,编写某种类型的存储库接口来获取、更新这些对象,并编写(第一个)仍然使用EntitySpace的实现。然后我可以重构当前直接使用EntitySpace的所有类和组件。这将使我能够在以后将存储库实现更改为使用webservice或EntityFramework

以下是我的问题/不安全感:

通常,我是希望有一个存储库对象放在某个地方,还是最好为组件提供一个返回(特定)存储库的工厂?也许我甚至可以为不同类型的对象将存储库拆分为不同的接口,这将导致大约20个ish接口

假设我有UI组件,它们现在在数据库上执行许多操作。如果我重写它们来处理存储库,那么给这些组件一个存储库对象,或者以一种他们甚至不必知道某个地方有存储库的方式重写这些UI组件,是更好的方法呢?假设有一个对话框,您可以从数据库中加载
零件
,对其进行更改并将其发送回。这可以被看作是某种
PartEditor
界面,当用户点击更新或删除按钮时,它可以被回调使用

您是否会使用DI框架来完成此任务?该应用程序相对较大,我认为大约800k loc,没有重用的公司范围的库。另一种方法是不使用DI框架,只对所有组件隐藏具体类,以避免引入新问题。对于使用我的新抽象的组件,这不应该有什么区别,因为这些组件应该以一种他们不需要知道所使用的DI框架的方式编写,对吗

我知道这很抽象,可能很难回答,但我希望其他人对这类任务有一些经验。我感谢你的指点。至于使用哪个DI框架的问题,我是完全开放的

通常,我是希望有一个存储库对象放在某个地方,还是最好为组件提供一个返回(特定)存储库的工厂?也许我甚至可以为不同类型的对象将存储库拆分为不同的接口,这将导致大约20个ish接口

我将为每个聚合根创建一个存储库。这使得维护和测试代码更加容易

假设我有UI组件,它们现在在数据库上执行许多操作。如果我重写它们来处理存储库,那么给这些组件一个存储库对象,或者以一种他们甚至不必知道某个地方有存储库的方式重写这些UI组件,是更好的方法呢?想象一下,有一个对话框,可以让你从数据库中加载一个部件,对其进行更改并将其发送回数据库。这可以被看作是某种PartEditor接口,当用户点击Update或Delete按钮时,可以为其提供回调

您应该为此使用存储库模式。您可以在批处理方法的存储库中切换到
DataAdapter
(如果您已经测量到EF性能对于这些场景来说太差)。这就是抽象的伟大之处。您可以在不影响代码其余部分的情况下根据需要调整实现

您是否会使用DI框架来完成此任务?该应用程序相对较大,我认为大约800k loc,没有重用的公司范围的库。另一种方法是不使用DI框架,只对所有组件隐藏具体类,以避免引入新问题。对于使用我的新抽象的组件,这不应该有什么区别,因为这些组件应该以一种他们不需要知道所使用的DI框架的方式编写,对吗

在处理数据库时,我确实使用了DI框架。让所有存储库共享相同的连接和事务(而不升级为分布式事务)变得更加容易

您可以在这里阅读我为EF制作的一个实现:

通常,我是希望有一个存储库对象放在某个地方,还是最好为组件提供一个返回(特定)存储库的工厂?也许我甚至可以为不同类型的对象将存储库拆分为不同的接口,这将导致大约20个ish接口

我将为每个聚合根创建一个存储库。这使得维护和测试代码更加容易

假设我有UI组件,它们现在在数据库上执行许多操作。如果我重写它们来处理存储库,那么给这些组件一个存储库对象,或者以一种他们甚至不必知道某个地方有存储库的方式重写这些UI组件,是更好的方法呢?想象一下,有一个对话框,可以让你从数据库中加载一个部件,对其进行更改并将其发送回数据库。这可以被看作是某种PartEditor接口,当用户点击Update或Delete按钮时,可以为其提供回调

您应该为此使用存储库模式。您可以在批处理方法的存储库中切换到
DataAdapter
(如果您已经测量到EF性能对于这些场景来说太差)。这就是腹肌的好处
// The factory hides who's the actual 
// repository implementation. In your case, it could be 
// EntityFrameworkRepository<T> or EFGenericRepository<T>
GenericRepository<Order> orderRepo = RepositoryFactory.Create<Order>();