2010-11-02 92 views
2

我正在制作一个支持多个数据库的应用程序。 beerhouse体系结构使用下面的单例从正确的提供者实例化正确的类。数据库工厂设计

static private ArticlesProvider _instance = null; 
    static public ArticlesProvider Instance 
    { 
    get 
    { 
     if (_instance == null) 
      _instance = (ArticlesProvider)Activator.CreateInstance(
       Type.GetType(Globals.Settings.Articles.ProviderType)); 
     return _instance; 
    } 
    } 

我有存储自定义栏目中我web.config的providertype,我试图建立一个工厂,实例化基础上,集供应商正确的DAL类。

上面的代码当前将整个名称空间存储在web.config中,与相关的DAL类相关,并且有点受限制,因为它只创建ArticlesProvider的实例。我怎样才能制造一个通用工厂,所以我可以通过例如SqlServer和任何类,例如ArticleDAL,我想实例化的提供类型

预先感谢您。

回答

3

我会考虑使用适当的依赖注入框架,我个人喜欢NInject。这将为您提供所需的所有工具来打破应用程序和底层数据库之间的依赖关系。

您注册与框架的映射,从接口到具体类型。这些映射可以在web.config中,或者在应用程序启动时的一些配置代码中。该框架将为您实例化这些类 - 如果需要的话,注入进一步的依赖关系。

所以你可以要求一个IArticleDAL的实例,如果IArticleDAL需要一个IDbConnection的实例来访问一个DB,那么NInject会自动创建一个并将它传递给IArticleDAL实现的构造函数。

无论如何 - 文档解释了它好得多......但总之,上面提取的代码仅仅是正确的依赖注入的原始起点。

+0

嗨詹姆斯提供商, ninject看起来有趣,唯一的是我仍然在学习.Net,所以想知道学习曲线是否会有点陡峭。 – gdp 2010-11-03 15:14:19

+0

我已经仔细研究了ninject,我得到了DI背后的概念,并认为我理解如何在我的页面/类中使用setter注入。不过,我很好奇我将在哪里部署它,我目前有3层UI,BL,DAL,并且正在考虑业务层。它是否正确? – gdp 2010-11-04 00:09:03

+0

geppie - 您可以在所有图层上使用它。例如,在MVC应用程序中通常使用DI生成控制器,以便您可以自动注入构造器参数 - 例如对BL的引用。在您的存储库中,您可以将引用注入到DAL中。把它看作是一种打破层内依赖关系的方法 - 也可以在层之间进行。开始时可能很难解决 - 但是当你熟悉它时,你应该看到它在很多层面都有效。一旦你开始考虑单元测试,它就变得非常宝贵。 – 2010-11-04 20:27:01

0

您需要使用AbstractFactory模式。

1

...我怎样才能使一个普通的工厂,这样我就可以在providertype如SqlServer的任何类如ArticleDAL我希望通过实例化?

我觉得你非常有 - 此刻的你正在传递,最终是在web.config中设置的值 - 所以不是特别有活力。

不是从web.config传入整个值,而是只传入类标识符。

...我怎样才能使一个普通的工厂......

我没有做过,像你我从网上值一直传递。配置。 诀窍在于:决定哪个DAL类被加载的责任在哪里。

它不能在业务层(BL) - 因为BL不应该知道关于数据访问层(DAL)的任何信息。

我可以尝试进一步回答,但使用更多信息会更容易一些,特别是有关以下问题的信息:决定将哪些DAL类加载的责任在哪里?

+0

嗨,adrian。 DAL类被加载的责任目前在我的DataAccess项目中,但是我们正在讨论是否将它置于Common中。谢谢。 – gdp 2010-11-03 15:12:52

0

只要删除所有这些第三方层,添加缓慢和错误的代码,并通过实施ProviderBase(即由MembershipProvider使用)使用Provider模式中构建的.net框架。该框架将负责其余部分。

我们必须为几个不同的数据库编写存储过程,尽管必须为每个数据库编写特定的DAL是一个很大的麻烦,但它确实很好。

0

我想知道为什么不使用Microsoft's own solution这种工作? DbProviderFactories类提供了将提供者名称作为输入的方法GetFactory

如果你在你的web.config,那么,

var conn = DbProviderFactories.GetFactory("providerName").CreateConnection(); 

一旦你的连接对象,你可以得到几乎一切从它在其他类似的DbCommand,DbDataReader等