繁体   English   中英

数据库工厂设计

[英]Database Factory Design

我正在制作一个支持多个数据库的应用程序。 啤酒屋的体系结构使用下面的单例从正确的提供程序实例化正确的类。

  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;
     }
  }

我将providertype存储在我的web.config的自定义部分中,并试图创建一个工厂,该工厂根据设置的提供程序实例化正确的DAL类。

上面的代码目前将存储在web.config的整个命名空间带到相关的DAL类,并且由于它仅创建ArticlesProvider实例而受到了一些限制。 我怎样才能建立一个通用工厂,这样我就可以传入要实例化的提供程序类型( 例如SqlServer)和任何类( 例如ArticleDAL)

先感谢您。

我个人会喜欢使用一个合适的依赖注入框架,我喜欢NInject 这将为您提供打破应用程序与基础数据库之间的依赖关系所需的所有工具。

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

因此,您可以要求一个IArticleDAL实例,如果IArticleDAL需要一个IDbConnection实例来访问数据库,则NInject将自动创建一个实例并将其传递给IArticleDAL实现的构造函数。

无论如何,文档会更好地解释它……但是总而言之,您上面提取的代码只是适当依赖注入的原始起点。

...我如何建立一个通用工厂,这样我就可以传入我想实例化的提供程序类型(例如SqlServer)和任何类(例如ArticleDAL)?

我认为您已经在这里了-目前您正在传递一个最终在web.config中设置的值-因此不是特别动态。

您可以只传递类标识符,而不是从web.config传递整个值。

我该如何建立一个通用工厂

我以前没有做过,就像您一样,我总是从web.config中传递一个值。 诀窍在于决定:决定加载哪个DAL类的责任在哪里。

它不能在业务层(BL)中-因为BL不应对数据访问层(DAL)一无所知。

我可以尝试进一步回答,但有了更多信息,尤其是可以阐明问题的信息,它将变得更加容易:决定加载哪个DAL类的责任在哪里?

只需消除所有这些添加了慢速和错误代码的第三方层,并通过实现ProviderBase即可使用Provider模式中内置的.net框架,即由MembershipProvider使用。 该框架将处理其余的工作。

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

我想知道为什么不使用Microsoft自己的解决方案来进行此类工作? DbProviderFactories类提供了GetFactory方法,该方法将提供程序名称作为输入。

如果您在web.config有提供者,那么,

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

一旦获得连接对象,您就可以从其中获得几乎所有其他内容,例如DbCommand,DbDataReader等。

您需要使用AbstractFactory模式。

数据访问对象可能有帮助吗? (链接在java中,但是概念仍然相同)

暂无
暂无

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

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