3-х слойная архитектура - PullRequest
       42

3-х слойная архитектура

2 голосов
/ 16 сентября 2010

Можно ли реализовать BLL и DAL с использованием частичного класса следующим образом:

 namespace BLL
{
   partial class Employee
  {
    public string EmpID { get; set; }
    public string EmpName { get; set; }

     public List<Employee> GetListOfEmployees()
     { 
       return DAL.Employee.GetListOfEmplyee();
      }

     }
  }

namespace DAL
{
 partial class Employee
 {
    public static List<Employee> GetListOfEmployees()
    {
        //DATA ACCESS
        var emps = GetEmployeesFromDb(); // fetch from db
        return emps;
   }
 }
}

или любые другие предложения? заранее спасибо.

Ответы [ 7 ]

3 голосов
/ 16 сентября 2010

Непонятно, чего вы пытаетесь достичь, сделав ваши уроки partial. Частичные классы полезны, когда вам нужно разделить один класс на несколько файлов - обычно потому, что одна или несколько частей генерируются машиной. В этом случае полезно разделять сгенерированные машиной части, отредактированные человеком, чтобы избежать перезаписи одного набора изменений или поломки другого.

В вашем примере использование частичного не дает больших результатов, поскольку два класса Employee находятся в разных пространствах имен - они не будут объединены в одну реализацию.

Возможно, если вы сможете объяснить проблему, которую пытаетесь решить, возможно, вы сможете получить лучший ответ на свой вопрос.

1 голос
/ 16 сентября 2010

Вы не можете использовать частичные классы таким образом - BLL.Employee - это другой класс, чем DAL.Employee, поскольку они находятся в разных пространствах имен. У вас просто будет 2 частичных класса без других частей.

Даже если они действительно представляют один и тот же класс, они не могут одновременно определять метод с одинаковой сигнатурой.

1 голос
/ 16 сентября 2010

Многое зависит от предпочтений, но лично я бы создал класс Factory для создания Employee / EmployeeCollection и не помещал его в сам объект.Если бы я действительно поместил его в объект, я бы сделал методы создания объекта статическими, чтобы вам не приходилось создавать пустые объекты только для создания реальных объектов.Я встроил логику создания, включая вызовы DAL, в реальный конструктор (используя внедрение зависимостей для получения конфигураций данных в объект).В этом случае конструкторы принимают такие вещи, как Id или Name - то, что вы используете для идентификации объекта.Он передает это в DAL и создает объект на основе результирующего набора.

0 голосов
/ 16 сентября 2010

Одна вещь, которая может ускользнуть от OP, - это то, что пространства имен - это просто причудливый способ выполнения искажения имен в некотором роде.Вы могли бы считать, что BLL.Employee будет преобразовываться в скомпилированный тип BLL_Employee, а DAL.Employee будет преобразовываться в скомпилированный тип DAL_Employee.(Это не совсем то, что происходит, но это подходит для моих целей в качестве иллюстрации.)

Когда среда выполнения идет для сравнения типов, становится очевидным, что BLL_Employee != DAL_Employee.В результате объявлять DAL.Employee частичным классом бессмысленно, потому что нет другого DAL_Employee, чтобы взять слабину и предоставить оставшуюся часть реализации.

Что вы хотите сделать, это создать два файлав том же пространстве имен.

// Employee.cs (In a BLL folder)
namespace BLL
{
    public class Employee
    {
        // Custom business logic.
    }
}

// Employee.cs (In the DAL folder)
namespace DAL
{
    public class Employee
    {
        // Custom data access code here. 
        // Not overwritten by code generator
    }
}

// Employee.designer.cs (In the DAL folder)
namespace DAL
{
    public partial class Employee
    {
        // Generated code goes here.
        // Frequently updated by code generation tools.
        // Do not manually update this code.
    }
}

Кроме того, вы не хотите смешивать бизнес логику с data acess логикой, что звучит как цель объединенияклассы в пространствах имен BLL и DAL.Major no-no.Держите их отдельно.Вы можете рассмотреть введение третьего набора классов, которые вы вызываете, которые скрывают классы доступа к данным в вашем пространстве имен DAL и просто возвращают подходящие бизнес-объекты из вашего пространства имен BLL.Таким образом, ваше пространство имен DAL не должно знать о вашем пространстве имен BLL, а пространство имен BLL не должно знать о пространстве имен DAL.

0 голосов
/ 16 сентября 2010

(1) Поместите свои бизнес-объекты / сущности таблиц в определенное общее место.Предположим, у вас есть следующие классы: Employee (может относиться к одной строке в таблице Employees), Department (может относиться к одной строке в таблице Departments) и т. Д. Эти классы, вероятно, используются во всех ваших слоях.Поэтому разместите их в общем месте с хорошо названными папками.

(2) Не размещайте бизнес-логику / логику данных в сущностях.Вы видите, вы положили GetListOfEmployees в Employee.Но на самом деле между ними мало отношений.Должен существовать класс с именем EmployeeManager, в котором для сотрудников выполняются такие действия, как поиск, обновление и удаление.

(3) См. Метод GetListOfEmployees в BLL и DAL, они абсолютно одинаковы!Но метод в BLL должен содержать «бизнес-логику», поэтому мы называем его BL-Layer.В методах BLL имена считаются «деловыми словами», например, в методе он говорит DAL «Мне нужны все сотрудники, порядок по имени».BLL говорит «что мне нужно», а DAL делает сбор.Методы в DAL не имеют ничего общего с бизнесом.

0 голосов
/ 16 сентября 2010

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

  • Employee.cs
  • Employee.bl.cs

Тогда ваш код Employee.cs будет выглядеть так:

namespace YourNamespace
{
    partial class Employee
    {
        public string EmpID { get; set; }
        public string EmpName { get; set; }
    }
}

И Employee.bl.cs будет выглядеть так:

namespace YourNamespace
{
    partial class Employee
    {
        public static List<Employee> GetListOfEmployees()
        {
            //DATA ACCESS
            var emps = GetEmployeesFromDb(); // fetch from db
            return emps;
        }
    }        
}

Хотя я бы подумал, что наличие класса Repository для извлечения данных было бы более уместным, чем наличие GetListOfEmployees внутри Employee.

Обновление:

Когда я говорю о хранилище, я имею в виду шаблон проектирования хранилища . Репозиторий - это интерфейс для извлечения и хранения объектов (например, из реляционной базы данных). Если вы используете ORM, такой как LINQ to SQL или ADO.NET Entity Framework, они обычно автоматически генерируют классы, которые выполняют эту роль. Если, однако, если вы пишете свой собственный код доступа к базе данных, вы можете создать свой собственный класс репозитория, например:

public class Repository
{
    public Repository(string connectionString)
    {
        // ...
    }

    public IEnumerable<Employee> GetEmployees()
    {
        return GetEmployeesFromDb();
    }

    public Employee GetEmployeeById(Guid id)
    {
        // ...
    }

    public void StoreEmployee(Employee employee)
    {
        // ...
    }

    // etc.
}

Преимущество этого заключается в том, что вам не нужно размещать код базы данных в вашем классе Employee или любом другом постоянном классе. Весь доступ к базе данных осуществляется через один интерфейс. Вы также можете создать interface и иметь несколько реализаций хранилища; таким образом, вы можете иметь способ хранить Employee экземпляров в файле, например, без необходимости изменять класс Employee.

0 голосов
/ 16 сентября 2010

Пожалуйста, исправьте меня, если я ошибаюсь, но создав частичный класс Employee в двух разных пространствах имен (DAL и BLL), вы просто создаете два разных класса. Похоже, вы хотите создать один класс, который состоит из двух частичных классов - это не так в вашем примере. В вашем примере кода вы можете просто удалить частичный идентификатор.

Кроме того, на мой взгляд, это хороший способ отделить бизнес-логику от пользовательского интерфейса и доступа к данным. Таким образом, можно использовать три сборки или просто три папки в одном проекте Visual Studio. В конечном итоге это всегда зависит от того, насколько сложным является ваше решение.

Особенно при использовании LINQ to SQL или сущностей я считаю хорошей практикой хранить как можно больше кода LINQ на уровне доступа к данным. Это сделает код более пригодным для повторного использования и тестирования.

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