关于这个话题的讨论很多,但每个人似乎都错过了一个明显的答案.我想帮助审查这个"明显的"IOC容器解决方案.各种对话假设运行时选择策略和使用IOC容器.我将继续这些假设.
我还想补充一个假设,即它不是必须选择的单一策略.相反,我可能需要检索一个对象图,该对象图在整个图的节点中找到了几个策略.
我将首先快速概述两个常用的解决方案,然后我将展示我希望看到IOC容器支持的"明显"替代方案.我将使用Unity作为示例语法,但我的问题不是Unity特有的.
这种方法要求每个新策略都手动添加绑定:
Container.RegisterType<IDataAccess, DefaultAccessor>();
Container.RegisterType<IDataAccess, AlphaAccessor>("Alpha");
Container.RegisterType<IDataAccess, BetaAccessor>("Beta");
Run Code Online (Sandbox Code Playgroud)
......然后明确要求正确的策略:
var strategy = Container.Resolve<IDataAccess>("Alpha");
Run Code Online (Sandbox Code Playgroud)
为了说明这种方法,假设以下类:
public class DataAccessFactory{
public IDataAccess Create(string strategy){
return //insert appropriate creation logic here.
}
public IDataAccess Create(){
return //Choose strategy through ambient context, such as thread-local-storage.
}
}
public class Consumer
{
public Consumer(DataAccessFactory datafactory)
{
//variation #1. Not sufficient to meet requirements.
var myDataStrategy = datafactory.Create("Alpha");
//variation #2. This is sufficient for requirements.
var myDataStrategy = …Run Code Online (Sandbox Code Playgroud) 我正在努力区分这两个异常,特别是根据它们的属性和用法:
FailedRecipient为单个电子邮件地址定义了一个属性SmtpFailedRecipientException这个面具SmtpFailedRecipientsException从逻辑上讲,我希望复数版本优先 - 服务器无法将您的电子邮件发送给任何收件人 - 超过服务器无法发送给单个特定收件人。
但是,如果您发送给 8 个收件人,其中两个失败怎么办 - 现在您会遇到什么异常?
就捕获, andSmtpClient.Send()而言,正确处理的调用应该是什么样子?SmtpFailedRecipientExceptionSmtpFailedRecipientsExceptionSmtpException