ошибка с перегрузкой конструктора для насмешки - PullRequest
4 голосов
/ 08 февраля 2012

У меня 3 сборки Presenter, Business и DataAccess.Presenter ссылается на Business и Business ссылается на DataAccess.

У меня есть класс CustomerBusiness, в сборке Business, с двумя конструкторами с одним параметром.Первый конструктор используется только для проверки на предмет доступа к данным.ICustomerDataAccess в сборке DataAccess.

    class CustomerBusiness()
    {
      private ICustomerDataAccess _data= null;

      public CustomerBusiness(ICustomerDataAccess data)
      {
        _data = data;
      }

      public CustomerBusiness(string language): this(new CustomerDataAccess("language"))
      {}

      public void SomeOtherMethods()
      {
        ...
      }
    }

В классе CustomerPresenter я написал приведенный ниже код, который выдает ошибку, что сборка DataAccess не упоминается в Presenter.Но я не хочу добавлять ссылку на DataAccess в Presenter.

var custBusiness = new CustomerBusiness ("english")

Может кто-нибудь порекомендовать, каков наилучший способ реализовать это, избегая ссылокDataAccess в Presenter?

Ошибка возникает только при наличии двух конструкторов с одним параметром.Ошибка проходит, когда у меня есть следующие конструкторы:

      public CustomerBusiness(ICustomerDataAccess data, string language)
      {
        _data = data;
      }

       public CustomerBusiness(string language): this(new CustomerDataAccess("language"))
  {}

Ответы [ 2 ]

2 голосов
/ 08 февраля 2012

Кто-нибудь может порекомендовать, каков наилучший способ реализовать это, избегая ссылки на DataAccess в Presenter?

Я бы предложил либо использовать контейнер IoC, либо пузырить ваши зависимости вплоть докорень вашего приложения ...

Вы правы - докладчик не должен знать о вашем классе доступа к данным.Но, когда вы попадаете в проблемные воды, ваш «CustomerBusiness» должен знать и нести ответственность за создание экземпляра класса доступа к данным.Тот первый конструктор, который вы используете для тестов, великолепен - он должен иметь only .

Затем ваш класс Presenter должен взять объект "CustomerBusiness" в своем конструкторе.,Затем он может использовать CustomerBusiness, не зная в первую очередь о том, как создать его экземпляр или как создать экземпляр объекта доступа к данным или даже о существовании объекта доступа к данным.

2 голосов
/ 08 февраля 2012

Я предлагаю вам перенести определения интерфейса в сборки контракта и внедрить вашу реализацию во время выполнения с использованием контейнера IOC (например, Unity , но есть из чего выбирать).

Это нарушит зависимость времени компиляции между сборками «реализации» и исключит необходимость создания отдельных конструкторов для прохождения имитаций.

Е.Г.

Presentation  refs  >>  IBusiness(Consumes)
Business      refs  >>  IBusiness(Implements), IDataAccess(Consumes)
IDataAccess   refs  >>  IDataAccess(Implements)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...