【问题标题】:Autofac resolve within class libraryAutofac 在类库中解析
【发布时间】:2019-06-21 17:57:02
【问题描述】:

我有一个网络表单应用程序 (myWebForms)

我有一个类库项目 (myClassLibrary),其中有一个名为“myClass”的类

WebForms 引用 myClassLibrary

我已将 Autofac 引用添加到 Web 表单应用程序,设置全局 asax 以解析“myClass”等...

我可以看到,在我后面的 aspx 代码中,我为 AutoFac 添加的公共属性已被 AutoFac 正确实例化。

到目前为止,这一切都很棒,但是,我的实际项目比这复杂得多,我需要做的是访问已解析的“myClass” 从 myClassLibrary 中

我如何做到这一点? (我是从 Web 表单项目中将容器注入到 myClass 中吗?我是以某种方式引用 Web 表单的全局属性,还是在 myClassLibrary 中再次构建容器?)

【问题讨论】:

标签: asp.net .net dependency-injection autofac class-library


【解决方案1】:

首先,我建议您查看有关 Web 表单和快速入门的 Autofac 文档。我认为您可能会通过这样做来回答很多问题,尽管我知道这很多。 DI 很复杂,我担心在这里只提供一个“快速答案”可能会导致您对正在发生的事情产生错误的理解。

一般...

  • 您向 Autofac 注册要注入的类型。这包括您的 Web 表单需要的所有类型以及这些类型需要的所有依赖项
  • Autofac 通过其集成解决依赖关系并将它们放入您的 Web 表单中。如果这些对象有依赖关系(例如,构造函数参数),那么 Autofac 将自动找出它们并将它们插入。

假设您的网络表单需要一个名为IEmailSender...的属性...

public IEmailSender EmailSender { get; set; }

您的电子邮件发件人对象可能需要一些其他依赖项,例如网络套接字工厂或其他东西。

public EmailSender(ISocketFactory socketFactory)

您可以在容器中注册这两者。 它们来自哪个程序集并不重要。您必须将它们注册到 Autofac 容器中才能正常工作。

builder.RegisterType<EmailSender>().As<IEmailSender>();
builder.RegisterType<TcpFactory>().As<ISocketFactory>();

当您的 web 表单获取 IEmailSender 时,Autofac 将首先解析 TcpFactory,然后在 EmailSender 的构造函数中提供它,然后将其交给您的 web 表单。

同样,文档和示例中涵盖了很多内容。虽然我知道有很多内容可能会让人不知所措,但我强烈建议您仔细阅读这些信息,因为从长远来看,它可以为您节省大量时间和痛苦。

【讨论】:

  • 谢谢你,我现在已经阅读了很多,并设法让 Autofac 在一些领域工作,但是,我仍然不确定最好的方法。到目前为止我看到的唯一选择是将构造函数调整为“哑”,然后可以将其注入。在我用来实例化对象的地方,我用“myObject.initiate(a,b)”方法替换它我添加到 myObject (它替换了构造函数)。但我听说这是代码异味,我也不想将包含从我的网络表单传递到我的库以允许在库中解析(我听说这也是一种代码异味)
猜你喜欢
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多