0

我正在创建一个新的ASP.Net网站“not mvc”,并且愿意让数据访问层有2个版本,一个使用Linq to Sql,另一个使用ad.net实体框架。 注意:kigg在MVC网站上做的是一样的,并且比我想要的要复杂得多。 我了解到实现我的目标的最佳模式是使用存储库设计模式。如何对这个Repository模式和ASP.Net网站架构进行排序?

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

我写道:

IRepository repository; 

然后在类constuctor

repository = MyRepositoryLinqToSql(); 

可一些人有智慧教我这部分的架构?

回答

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将动态地为您处理脏兮兮的工作。

1

这是一个需要回答的重要问题,但是您可以添加一个构造函数,它将IRepository实例作为参数并在类中使用它。至于如何填充它,请做一些关于反转控制容器的研究,如Spring和Windsor。这些工具会获取关于您想要使用的特定实现的配置细节,然后自动将这些实例传递给类的构造函数和属性。

例如,您可以指定你想要的IRepository的版本在你的app.config文件来使用,并徘徊无论这似乎在构造您所选择的类的实例将被传递。

相关问题