我正在寻找一种设计技术来实现以下目标。
到目前为止我所做的是,我创建了以下内容:
IDataProvider
- StartReadData()
- EndReadData()
- List<DataObjs> (contains data)
XmlDataProvider : IDataProvider
CsvDataProvider : IDataProvider
IDataProviderManager
- List<IDataProvider> (has a collection of dataprovider)
DataProviderManager : IDataProvideManager
现在,我正在寻找一种更好的技术,通过它我可以实例化IDataProviders并以可配置的方式管理它(添加或删除更多IDataProviders类,而无需对代码进行任何更改或重新编译)。 / p>
欢迎任何不错的设计技巧或类似代码的链接。
非常感谢。
答案 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提供的解决方案的混合。
IDataProvider
的界面。 IDataprovider
的类)。答案 2 :(得分:0)
使用工厂模式作为第一步抽象出提供者的实例化。
在那个工厂里你可以选择实现:config,reflection等。
但我的猜测是,从长远来看,你最终会使用IoC容器,因为它们正在按照你想要的那样做(并且更好)
大多数容器都可以扫描程序集并将它们透明地导入应用程序,而无需重新编译。
我建议花一点时间来了解DI而不是浪费时间来发明自己的解决方案。 (这将是向btw学习的东西)
使用工厂可以在找到适合您的最终解决方案时更改实施而不会破坏您的应用程序。