【问题标题】:How to sort this Repository pattern and ASP.Net website architecture?如何对这个 Repository 模式和 ASP.Net 网站架构进行排序?
【发布时间】:2010-11-26 07:00:10
【问题描述】:

我正在创建一个新的ASP.Net网站“不是mvc”,并且愿意使数据访问层有2个版本,一个使用Linq to Sql,另一个使用ad.net实体框架。 注意:kigg 也在做同样的事情,但是在 MVC 网站上,比我想要的复杂。 我了解到实现我的目标的最佳模式是使用存储库设计模式。

我的问题是,在我的代码和层“dal、bal、ui”中的哪个位置会发生切换?换句话说,我将更改代码以将 linq 应用于 sql 到 ado.net 实体框架,反之亦然。

我写道:

IRepository repository;

然后在类构造函数中

repository = MyRepositoryLinqToSql();

有人可以教我这部分架构吗?

【问题讨论】:

    标签: asp.net linq-to-sql design-patterns architecture linq-to-entities


    【解决方案1】:

    如果您想创建一个可插入的架构,以便能够即时交换存储库层,那么您将需要在接口后面创建所有内容,然后使用 StructureMap 之类的东西在需要时动态交换所需内容.

    您可能想要定义一个存储库类,例如 AccountRepository。一种用于 linq to sql LSAccountRepository 和 EFAccountRepository。这两个都继承自 IAccountRepository 并具有 GetAccountByID、SaveAccount、DeleteAccount 等方法。

    然后使用 StructureMap 您将使用类似这样的语法来根据您正在加载的系统加载适当的存储库。

    IAccountRepository _accountRepository = ObjectFactory.GetInstance();

    然后通过您的配置,您可以指定 IAccountRepository 的默认实现并将其换出以随时指向任一实现。

    如果这太复杂,那么可以使用依赖注入模式,因为您可以拥有一个带有 IAccountRepository 参数的方法。此方法将由控制器(MVP 或 MVC)调用,此时您可以传入适当的引用。这样,您就不会在可能需要一个存储库与另一个存储库的方法内直接实例化存储库。

    即使您决定使用 DI 模式,您仍然可以使用 StructureMap。当您实例化一个具有其他依赖关系的对象时,StructureMap 知道(在构造函数中),然后 StructureMap 也将加载这些对象。然后具有您需要的方法的对象的调用者将是唯一需要的松散耦合,因为 StructureMap 将动态地为您处理脏工作。

    【讨论】:

      【解决方案2】:

      这是一个有点难以回答的问题,但是您可以添加一个构造函数,该构造函数将 IRepository 实例作为参数并在类本身中使用它。至于如何填充它,请对 Inversion of Control 容器如 Spring 和 Windsor 做一些研究。这些工具获取有关您要使用哪些特定实现的配置详细信息,然后自动将这些实例传递给类的构造函数和属性。

      例如,您可以在 app.config 文件中指明要使用的 IRepository 版本,并且无论它出现在构造函数中的何处,都会传入您选择的类的实例。

      【讨论】:

        【解决方案3】:

        我认为您正在寻找“依赖注入”解决方案。

        解决这个问题:

        【讨论】:

          猜你喜欢
          • 2012-12-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-29
          • 2016-02-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多