Избегать переписывания конструкторов производных классов? - PullRequest
0 голосов
/ 30 марта 2019

У меня есть 3 (не считая классов обслуживания) классов C # и их конструкторы, которые написаны таким образом, чтобы использовать Внедрение зависимостей (я использую Microsoft Unity DI framework) следующим образом :

public class BaseClass
{
    public ServiceClass1 Sc1 {get;set;}
    public ServiceClass2 Sc2 {get; set;}

    public BaseClass(
           ServiceClass1 sc1,
           ServiceClass2 sc2
    )
    {
       Sc1 = sc1;
       Sc2 = sc2;

       // assign C# Session value to property UserEmail for all Service classes that are passed in the Base class contructor
      SC1.UserEmail = (string) Session["UserEmail"];
      SC2.UserEmail = (string) Session["UserEmail"];
    }


}

public class DerivedClass1: BaseClass
{
    public DerivedClass1 (
           ServiceClass1 sc1,
           ServiceClass2 sc2
    ): base(sc1, sc2)
    {

    }
}

public class DerivedClass2: BaseClass
{
    public DerivedClass2 (
           ServiceClass1 sc1,
           ServiceClass2 sc2
    ): base(sc1, sc2)
    {

    }
}

Проблема заключается в том, что всякий раз, когда используется новый класс Service, его необходимо добавить в список параметров конструктора базового класса, а список параметров конструктора производных классов необходимо обновить, чтобы свойство UserName новый класс обслуживания назначается как другие предыдущие классы обслуживания. Также к базовому классу должно быть добавлено новое типизированное свойство класса Service (я знаю, что не могу избежать добавления такого нового свойства класса Service к базовому классу). Я должен переписать конструкторы классов Base и Re следующим образом

public class BaseClass
    {
        public ServiceClass1 Sc1 {get;set;}
        public ServiceClass2 Sc2 {get; set;}
        public ServiceClass3 Sc3 {get; set;} // added property

        public BaseClass(
               ServiceClass1 sc1,
               ServiceClass2 sc2,
               ServiceClass3 sc3 // added constructor parameter
        )
        {
           Sc1 = sc1;
           Sc2 = sc2;
           Sc3 = sc3; // added code line

           // assign C# Session value to property UserEmail for all Service classes that are passed in the Base class contructor
          SC1.UserEmail = (string) Session["UserEmail"];
          SC2.UserEmail = (string) Session["UserEmail"];
          Sc3.UserEmail = (string) Session["UserEmail"]; // added code line
        }


    }

    public class DerivedClass1: BaseClass
    {
        public DerivedClass1 (
               ServiceClass1 sc1,
               ServiceClass2 sc2,
               ServiceClass3 sc3 // added parameter
        ): base(sc1, sc2, sc3) // re-write passing arguments
        {

        }
    }

    public class DerivedClass2: BaseClass
    {
        public DerivedClass2 (
               ServiceClass1 sc1,
               ServiceClass2 sc2,
               ServiceClass3 sc3 // added parameter
        ): base(sc1, sc2, sc3) // re-write passing arguments
        {

        }
    }

Мой вопрос: как можно избежать модификации конструкторов производных классов, когда в конструктор базового класса добавляется новый класс Service?

1 Ответ

0 голосов
/ 30 марта 2019

Единственный способ решить эту проблему - не использовать конструктор для определения ваших зависимостей.Некоторые фреймворки Dependency Injection, такие как AutoFac, поддерживают свойство инъекций .

Таким образом, вам не нужен конструктор для установки зависимостей, но вместо этого Dependency Injection Framework заботится о настройке свойств зависимости для вас.

Недостатком этого является то, что если вы создаете свой экземпляр без Dependency Injection Framework или не инициализируете внедрение свойства, то вы «должны знать», что вы должны установить свойства зависимости, потому чтоесть не конструктор, который заставляет вас устанавливать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...