Architecture 20通过构造函数执行IOC的依赖项

Architecture 20通过构造函数执行IOC的依赖项,architecture,Architecture,我有一个叫做MessageService的类。这个类实际上负责接收电子邮件流。根据邮件的主题,它会检测哪个流处于危险状态并执行操作 用一些代码来解释我的问题可能更简单: public class MessageService { public void ReadEmail() { switch (subject) "1" : Myservice.action1(); break; "2" :

我有一个叫做MessageService的类。这个类实际上负责接收电子邮件流。根据邮件的主题,它会检测哪个流处于危险状态并执行操作

用一些代码来解释我的问题可能更简单:

public class MessageService
{
    public void ReadEmail()
    {
      switch (subject)
         "1" :
          Myservice.action1(); break;
         "2" :
          Myservice.action2(); break;
         "qwwerty" :
          MyOtherservice.Querty(); break;
          etc...
    }
}
为了进行一些控制反转,我想通过类MessageService的构造函数传递对服务的引用

public MessageService(IMyService myService,IMyOtherservice myOtherservice, ect....)
{
    Myservice=myService;
    MyOtherservice=myOtherservice;
}
对于一些引用来说,这将非常有用,但是MessageService类可以处理多达20、30或40个不同的流。这会使我的班级的初始化有点沉重

有没有更好的方法来实现它?通过某种设计模式?我是否应该关心国际奥委会,我喜欢在……之后在课堂上进行测试


感谢您的帮助,

您可能希望使用责任链设计模式。创建一个知道如何处理电子邮件的界面,并为您想要执行的每个任务构建单独的类,大致相当于您的switch语句switch,顺便说一句,这是COR的一个非常简单的实现。这些类将只接受它们所需的服务。然后在MessageService中,获取这些接口的列表,并一次一个地处理它们,直到其中一个表示它已处理它们:

public interface IMessageReader
{
  /// <returns><c>true</c> if handled; otherwise false
  bool ReadEmail(Mail message);
}

public class QwertyMessageReader : IMessageReader
{
  public QwertyMessageReader(IMyOtherService otherService) {/*set*/}
  public bool ReadEmail(Mail message)
  {
     if(message.Subject.Equals("qwwerty"))
     {
       otherService.Querty();
       return true;
     }
     return false;
  }
}

public class MessageService
{
    public MessageService(IEnumerable<IMessageReader> readers) {/*set*/}
    public void ReadEmail()
    {
      var handled = readers.Select(reader => reader.ReadEmail(message))
                           .FirstOrDefault(result => result);
    }
}
您需要调整上面的接口和代码以适应您正在做的事情,但这是主要的概念


如果您注册多个相同接口,大多数体面的IOC容器将自动为您生成IEnumerable。

最好的建议是将您的类分解为更小的类。在一个类中有30或40个依赖项表明它做得太多了。尝试将每个类分解成只做一件事的类,然后您可以开始将它们组合成更大的功能块。因为您使用的是IoC容器,所以这实际上并不难做到,而且会使您的代码更易于测试。理想的目标是为每个类争取一个或两个依赖项,但实际上,我认为4或5是一个很好的目标


由于不知道您的代码到底在做什么,很难提出具体的设计模式。

我也是这么想的,但我有点不知所措,不知道如何打破我的类。。。我会更仔细地看一看,如果我发现了什么,我会告诉你的。。还是谢谢。很好的解决方案,我非常喜欢。不幸的是,我不确定我的国际奥委会是否会做这项工作,因为它是一些同事自己做的,人们真的不愿意做一些不同的事情。我看看我能做些什么,我会回来的。。谢谢你!