C#设计帮助 - 处理提供者的实例

时间:2012-10-09 10:15:16

标签: c# .net design-patterns

我正在寻找一种设计技术来实现以下目标。

  • 两个不同的数据源来读取数据
  • 我需要能够动态添加或删除更多数据源

到目前为止我所做的是,我创建了以下内容:

IDataProvider 
- StartReadData()
- EndReadData()
- List<DataObjs> (contains data)

   XmlDataProvider : IDataProvider
   CsvDataProvider : IDataProvider

IDataProviderManager
- List<IDataProvider> (has a collection of dataprovider)

  DataProviderManager : IDataProvideManager

现在,我正在寻找一种更好的技术,通过它我可以实例化IDataProviders并以可配置的方式管理它(添加或删除更多IDataProviders类,而无需对代码进行任何更改或重新编译)。 / p>

欢迎任何不错的设计技巧或类似代码的链接。

非常感谢。

3 个答案:

答案 0 :(得分:2)

只要将提供程序保存在单独的程序集中,就可以在配置文件中定义它们并在运行时实例化它们:

 <DataProviders>
 <provider name="XmlDataProvider" 
      type="Separate.Assembly.Providers.XmlDataProvider, Separate.Assembly"/>
<provider name="CsvDataProvider" 
      type="Separate.Assembly.Providers.CsvDataProvider, Separate.Assembly"/>
</DataProviders>

然后,您的代码必须读取并解析配置,然后动态加载类型。

答案 1 :(得分:1)

如果您不想每次都重新编译,那么解决方案可能是您自己的解决方案和@Stuart Dunkeld提供的解决方案的混合。

  1. 定义一些类似IDataProvider的界面。
  2. 编写一些配置节处理程序(实现IConfigurationSectionHandler)并在应用程序配置中配置所有数据提供程序(实现IDataprovider的类)。
  3. 添加一些“manager”类,用于为特定类型加载已配置的数据提供程序。您可以使用IUnityContainer之类的东西来了解依赖关系并解决它。

答案 2 :(得分:0)

使用工厂模式作为第一步抽象出提供者的实例化。

在那个工厂里你可以选择实现:config,reflection等。

但我的猜测是,从长远来看,你最终会使用IoC容器,因为它们正在按照你想要的那样做(并且更好)

大多数容器都可以扫描程序集并将它们透明地导入应用程序,而无需重新编译。

我建议花一点时间来了解DI而不是浪费时间来发明自己的解决方案。 (这将是向btw学习的东西)

使用工厂可以在找到适合您的最终解决方案时更改实施而不会破坏您的应用程序。