1

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

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

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

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

   XmlDataProvider : IDataProvider
   CsvDataProvider : IDataProvider

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

  DataProviderManager : IDataProvideManager

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

欢迎任何好的设计技术或类似代码的链接。

非常感谢。

4

3 回答 3

2

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

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

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

于 2012-10-09T10:41:53.993 回答
1

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

  1. 定义一些接口,如IDataProvider.
  2. 编写一些配置节处理程序(实现IConfigurationSectionHandlerIDataprovider )并在应用程序配置中配置所有数据提供者(实现类)。
  3. 添加一些“管理器”类,为特定类型加载配置的数据提供程序。您可以使用类似IUnityContainer的东西来了解依赖关系并解决它。
于 2012-10-09T11:13:15.047 回答
0

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

在那个工厂里,你可以用任何一种方式来实现:配置、反射等。

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

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

我建议花一点时间来了解 DI,而不是浪费时间发明自己的解决方案。(顺便说一句,这也是值得学习的东西)

当您找到适合您的最终解决方案时,使用工厂可以在不破坏应用程序的情况下更改实现。

于 2012-10-09T10:37:37.177 回答