Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IoC Windows服务体系结构_C#_Architecture_Inversion Of Control_Autofac - Fatal编程技术网

C# IoC Windows服务体系结构

C# IoC Windows服务体系结构,c#,architecture,inversion-of-control,autofac,C#,Architecture,Inversion Of Control,Autofac,我传统上是一个SQL的家伙。我有很多C#经验,但这些都是工具或定制项目 我现在的任务是编写一个应用程序,该应用程序执行以下操作 作为windows服务运行 监视文件,并在文件到达时将其加载到数据库 监视数据库中新加载的文件 对这些文件执行一些复杂的解析(包括聚合db记录) 需要额外的接口(查询解析数据的网站等) 必须支持多种文件类型,必须支持多种解析器 所以,这是我第一次进入国际奥委会,我正在尽我最大的努力做正确的事情。我正在使用Autofac,对这些概念非常熟悉。我的问题是理解复合根,当可

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

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

  • 作为windows服务运行
  • 监视文件,并在文件到达时将其加载到数据库
  • 监视数据库中新加载的文件
  • 对这些文件执行一些复杂的解析(包括聚合db记录)
  • 需要额外的接口(查询解析数据的网站等)
  • 必须支持多种文件类型,必须支持多种解析器
所以,这是我第一次进入国际奥委会,我正在尽我最大的努力做正确的事情。我正在使用Autofac,对这些概念非常熟悉。我的问题是理解复合根,当可以传递一个容器时,我应该用什么来代替我传统的“工厂”概念。 我的应用程序是由L2S模型和通用存储库接口构成的。我使用Autofac模块注册具体类型。我有一个记录器,并使用一个模块来注册具体类型。在我的测试控制台应用程序(将由windows服务主机替换)中,我创建一个容器并注册记录器和dal模块等。然后,我可以使用构造函数注入来解析我的文件监视类,以注入记录器和存储库。我还注入了一个队列对象(在我的例子中是一个内存支持的队列,但也可以是一个db队列),新文件将被加入队列(producer)。在队列的另一端,我需要一个消费者。因此,根据要出列的文件类型,我需要使用不同的加载程序类。我通常会使用工厂模式返回适当的具体类。由于加载器类需要有一个记录器和适当的存储库注入其中,我无法看到如何创建适当加载器类的实例来处理队列中的项目,而不给我的工厂类一个对IoC容器的引用。我知道我可以将各种项目处理程序注入到我的consumer类中,但是假设我有50种文件类型,或者100种,这是不切实际的

在我理解了如何做到这一点之后,我需要做一些类似的事情来监视新的解析作业(db表中的条目)并处理它们,但我假设它将遵循与上面类似的模式


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

我已经意识到,我可以新建一组加载器类,将它们放入字典并将其传递给构造函数。这让我可以按名字要求一个加载器

听起来好像你在试图用容器构造应用程序中的每一个实体——节约使用DI,并且只在你需要可替代行为的地方使用,在适当的地方使用简单的“新”并没有什么错


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

以下是我对新手应该如何开始的看法

开始写你的课程。对其他类的所有依赖都在构造函数中获取

由于除了在构建对象时,您从未在任何其他点创建类以获取实例,因此它将使您的程序看起来类似于以下内容:

static void Main(..) {
  var s1 = ...;
  var s2 = ...;
  var sn = ... SN(s1, s2, ..);
  sn.Wait();
}
现在你可以替换所有。。。在您的容器中注册。您根本不使用工厂类;IoC容器是您的工厂。然后替换根初始化:

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

现在您正在使用IoC。不要用字典。

我认为你已经太聪明了。