【发布时间】:2018-01-20 17:32:56
【问题描述】:
我在理解 IoC 时遇到了一些麻烦 - 特别是使用 Unity。
假设我有一个要用来发送电子邮件的应用程序。我会这样建模:
public interface IEmailSender
{
void SendEmail();
}
然后创建一些接口的实现:
public class GmailEmailSender : IEmailSender
{
public void SendEmail()
{
//code to send email using Gmail
}
}
public class YahooEmailSender : IEmailSender
{
public void SendEmail()
{
//code to send email using Yahoo
}
}
我也有一门课来实际发送电子邮件
public class EmailSender
{
IEmailSender _emailSender;
public EmailSender(IEmailSender emailSender)
{
_emailSender= emailSender;
}
public void Send()
{
_emailSender.SendEmail();
}
}
所以我了解如何将 Unity 配置为始终使用其中一种实现:
IUnityContainer container = new UnityContainer().RegisterType<IEmailSender, GmailEmailSender>());
但我不太了解的是,如果我想根据某些标准选择 YahooEmailSender 并根据其他标准选择 GmailEmailSender,我在哪里编写逻辑代码来做出决定,然后注入适当的具体实现到 EmailSender 构造函数,不使用
EmailSender emailSender = new EmailSender(new YahooEmailSender());
【问题讨论】:
-
stackoverflow.com/questions/23669502/…,可能重复...或者您正在寻找自动选择命名注册的注册工厂 - 示例使用可能会有所帮助...
-
感谢您的回复。我认为这些链接中的任何一个都不是我正在寻找的。我可能只是普遍误解了 Unity 的目的。我了解它对于轻松传递日志记录类型依赖项或在配置容器后不会更改的标准配置有什么帮助,我正在询问更多关于它适合的位置,就好像你不能提交一个具体的在配置时实现。
-
见Dependency injection type-selection 和Dependency Injection Unity - Conditional resolving。 DI 容器用于在应用程序启动时解析对象图,而不是用于控制运行时行为。如果是后者,您应该使用一个或多个design patterns 来解决问题,因为这显然不是 DI 问题,而是应用程序设计问题。
标签: c# dependency-injection inversion-of-control unity-container