Как мне избежать ссылки на DataLayer на уровне пользовательского интерфейса? - PullRequest
4 голосов
/ 26 мая 2011

У меня есть проект с 3 слоями.Пользовательский интерфейс, бизнес-уровень и уровень данных.

Пользовательский интерфейс вызывает BL.BL Calls DL.DL выполняет операции с базой данных.Это так просто.

Я хотел провести модульное тестирование моих методов BL, поэтому я немного его изменил, и теперь я принимаю DL в качестве параметра в конструкторе BL, чтобы я мог создать объект Mock из DL.

Это заставляет меня менять свой уровень пользовательского интерфейса, так как мой пользовательский интерфейс вызывает мой BL, и в соответствии с правилами архитектуры я считаю, что это не очень хороший дизайн, если я добавляю ссылку на мой DL в свой пользовательский интерфейс.

Может кто-нибудь предложить лучший вариантпуть?Нужно ли менять архитектуру или я что-то здесь не так делаю?Может быть, я могу представить Facade Manager здесь?Пример вашего предложения будет высоко оценен.

- Правка -

Вот код:

в BL:

    public MyBusinessLayer()
    {

    }
    //To pass mock object of WCF Service
    public MyBusinessLayer(ISomeServices svc)
    {
        someServiceRef = svc;
    }

    //To pass mock object of Data Layer.
    public MyBusinessLayer(ISomeDataLayer dl)
    {
        someDlRef = dl;
    }

в пользовательском интерфейсе:

//To do this i have to add DL reference to UI
MyBusinessLater b = new MyBusinessLayer(new ISomeService());

Ответы [ 3 ]

4 голосов
/ 26 мая 2011

IoC идеально подходит для этой работы.Ваш BL должен полагаться только на интерфейс, который может получать необходимые ему данные.Затем, используя IoC, зарегистрируйте фактическую реализацию БД с помощью интерфейса.Пользовательский интерфейс должен затем вводиться с интерфейсом BL.Поэтому, когда приложение запускается, вы регистрируете все зависимости и просто внедряете интерфейс BL в пользовательский интерфейс, поэтому пользовательский интерфейс не знает о том факте, что фактическая реализация BL основана на интерфейсе DL.

Вот только на примере, который я нашел в сети.Просто Google для C # IOC или C # Dependency Injection.http://www.dotnetspark.com/kb/266-inversion-control-ioc-and-dependency-injection.aspx

1 голос
/ 26 мая 2011

Один из способов сделать это - поместить все типы данных в отдельную DLL.

Затем обратитесь к этой dll из UI, BL и DAL.

Тогда для пользовательского интерфейса нет необходимости ссылаться на DAL.

0 голосов
/ 27 мая 2011

@ BFree ответ правильный;Я просто отвечаю, чтобы уточнить мои комментарии.Вот что я бы порекомендовал (что, как я считаю, совпадает с рекомендациями @BFree):

public class MyBusinessLayer : IBusinessLayer
{
    public MyBusinessLayer(ISomeDataLayer dl, ISomeServices svc) {}
}

public class MyUI
{
    public MyUI(IBusinessLayer bl) {}
}

Используете ли вы MVC, MVVM или что-то еще, что-то где-то создает ваш пользовательский интерфейс (илиего контроллер).Этот метод узнает обо всем, так как он все связывает.Все остальное знает только об интерфейсах.

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

...