7

我传统上是一个 SQL 人。我有很多 C# 经验,但这些都倾向于工具或定制项目。

我现在的任务是编写一个执行以下操作的应用程序......

  • 作为 Windows 服务运行
  • 监视文件,当它们到达时,将它们加载到数据库
  • 监视数据库中新加载的文件
  • 对这些文件执行一些复杂的解析(涉及聚合数据库记录)
  • 需要额外的接口(用于查询解析数据等的网站)
  • 必须支持多种文件类型,必须支持多种解析器。

所以,这是我第一次涉足 IoC,我正在尽我所能正确地做事。我正在使用 Autofac 并且对这些概念非常满意。我的问题是理解组合根,当可以通过容器时,我应该用什么来代替我传统的“工厂”概念。我的应用程序由 L2S 模型和通用存储库接口构成。我使用 Autofac 模块来注册具体类型。我有一个记录器并使用一个模块来注册具体类型。在我的测试控制台应用程序(将被 Windows 服务主机替换)中,我创建了一个容器并注册了记录器和 dal 模块等。然后我可以使用构造函数注入来解析我的文件监视类以注入记录器和存储库。我还注入了一个队列对象(在我的例子中是一个内存支持的队列,但可能是一个数据库队列),新文件排队(生产者)。在队列的另一端,我需要一个消费者。因此,根据出列文件的类型,我需要使用不同的加载器类。我会在历史上使用工厂模式来返回适当的具体类。由于加载器类需要有一个记录器和适当的存储库注入其中,我看不到如何创建适当的加载器类的实例来处理从队列中出来的项目,而不给我的工厂类提供对 IoC 容器的引用。我知道我可以将各种项目处理程序注入到我的消费者类中,但是说我有 50 种文件类型,或者说 100 种,这是不切实际的。我需要使用不同的加载器类。我会在历史上使用工厂模式来返回适当的具体类。由于加载器类需要有一个记录器和适当的存储库注入其中,我看不到如何创建适当的加载器类的实例来处理从队列中出来的项目,而不给我的工厂类提供对 IoC 容器的引用。我知道我可以将各种项目处理程序注入到我的消费者类中,但是说我有 50 种文件类型,或者说 100 种,这是不切实际的。我需要使用不同的加载器类。我会在历史上使用工厂模式来返回适当的具体类。由于加载器类需要有一个记录器和适当的存储库注入其中,我看不到如何创建适当的加载器类的实例来处理从队列中出来的项目,而不给我的工厂类提供对 IoC 容器的引用。我知道我可以将各种项目处理程序注入到我的消费者类中,但是说我有 50 种文件类型,或者说 100 种,这是不切实际的。如果不给我的工厂类提供对 IoC 容器的引用,我看不到如何创建适当的加载器类的实例来处理从队列中出来的项目。我知道我可以将各种项目处理程序注入到我的消费者类中,但是说我有 50 种文件类型,或者说 100 种,这是不切实际的。如果不给我的工厂类提供对 IoC 容器的引用,我看不到如何创建适当的加载器类的实例来处理从队列中出来的项目。我知道我可以将各种项目处理程序注入到我的消费者类中,但是说我有 50 种文件类型,或者说 100 种,这是不切实际的。

在我了解如何执行此操作后,我需要执行类似的操作来监视新的解析作业(数据库表中的条目)并处理这些作业,但我假设它会遵循与上述类似的模式。

大家有什么建议吗?我距离合并我的 C# 和去 SSIS 进行文件加载,然后在 SSIS 中破解一些讨厌的解析器代码还有这么远(小距离)。请帮助 C# 学习者。

4

3 回答 3

1

听起来您正在尝试在应用程序中构建每个实体的容器 - 谨慎使用 DI,并且仅在您需要可替代行为的地方使用,在适当的情况下使用普通的旧“新”没有任何问题。

另一个建议可能是使用接口标记自定义文件加载器,比如 IFileLoader,运行所有加载的程序集并(使用反射)检测实现的加载器。然后,将所有加载器组装在一个责任链中,这样如果一个加载器无法处理相关文件类型,它就会将责任传递给下一个。这样,添加新的加载器将很容易,并且文件监视部分与加载部分明显分开。COR 模式不是必须的,当然可以通过简单的循环来提供功能。

于 2012-10-12T07:23:59.420 回答
1

Here's my take on how you as a newbie should start.

Start writing your classes. All dependencies on other classes are taken in the constructor.

Since you never new up a class to get an instance at any other point than when you are constructing your objects, it will make your program look similar to this:

static void Main(..) {
  var s1 = ...;
  var s2 = ...;
  var sn = ... SN(s1, s2, ..);
  sn.Wait();
}

Now you can replace all ... with registrations in your container. You don't use factory classes at all; an IoC container IS your factory. And then you replace the very root initialisation:

var sn = container.Resolve<SN>();

Now you are using IoC. Don't use a dictionary.

于 2012-10-12T07:47:51.133 回答
1

我已经意识到我可以新建一堆加载器类并将它们放入字典中并将其传递给构造函数。这使我可以按名称询问装载机。

于 2012-10-03T07:05:22.277 回答