小编Vas*_*dis的帖子

依赖注入与策略模式

关于这个话题的讨论很多,但每个人似乎都错过了一个明显的答案.我想帮助审查这个"明显的"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)
  • 优点:简单,并得到所有IOC容器的支持
  • 缺点:
    • 通常将调用者绑定到IOC容器,当然要求调用者知道有关策略的信息(例如名称"Alpha").
    • 必须手动将每个新策略添加到绑定列表中.
    • 此方法不适合处理对象图中的多个策略.简而言之,它不符合要求.

抽象工厂

为了说明这种方法,假设以下类:

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)

.net c# dependency-injection ioc-container strategy-pattern

18
推荐指数
1
解决办法
6869
查看次数

SmtpFailedRecipientException 和 SmtpFailedRecipientsException

我正在努力区分这两个异常,特别是根据它们的属性和用法:

  • 它们都FailedRecipient为单个电子邮件地址定义了一个属性
  • 如果你抓住SmtpFailedRecipientException这个面具SmtpFailedRecipientsException

从逻辑上讲,我希望复数版本优先 - 服务器无法将您的电子邮件发送给任何收件人 - 超过服务器无法发送给单个特定收件人。

但是,如果您发送给 8 个收件人,其中两个失败怎么办 - 现在您会遇到什么异常?

就捕获, andSmtpClient.Send()而言,正确处理的调用应该是什么样子?SmtpFailedRecipientExceptionSmtpFailedRecipientsExceptionSmtpException

.net c# exception smtpclient

3
推荐指数
1
解决办法
1639
查看次数