3-уровневая архитектура состоит из 3 основных уровней
- PL Уровень представления
- BLL Уровень бизнес-логики
- DAL Уровень доступа к данным
каждый верхний слой запрашивает только нижний слой и никогда не видит ничего поверх него.
Когда Вас спрашивают о Как вы будете строить свой BLL , вы можете написать что-то вроде:
namespace Company.BLL
{
// let's create an interface so it's easy to create other BLL's if needed
public interface ICompanyBLL
{
public int Save(Order order, UserPermissions user);
}
public class Orders : ICompanyBLL
{
// Dependency Injection so you can use any kind of BLL
// based in a workflow for example
private Company.DAL db;
public Orders(Company.DAL dalObject)
{
this.db = dalObject;
}
// As this is a Business Layer, here is where you check for user rights
// to perform actions before you access the DAL
public int Save(Order order, UserPermissions user)
{
if(user.HasPermissionSaveOrders)
return db.Orders.Save(order);
else
return -1;
}
}
}
В качестве живого примера проекта, который я создаю:
PL - все общедоступные службы, мой DAL обрабатывает весь доступ к базе данных, у меня есть Service Layer , который обрабатывает 2 версиисервиса, старого ASMX и нового сервиса WCF, они выставляются через Interface
, поэтому мне легко на лету выбрать, какой сервис будет использовать пользователь
public class MainController : Controller
{
public IServiceRepository service;
protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
...
if (thisUser.currentConnection.ws_version == 6)
// Use old ASMX Web Service
service = new WebServiceRepository6(url, ws_usr, ws_pwd);
else if (thisUser.currentConnection.ws_version == 7)
// Use the brand new WCF Service
service = new WebServiceRepository7(url, ws_usr, ws_pwd);
...
}
}
Вкод выше, я просто использую Dependency Injection, чтобы отделить знания от другого уровня, как на этом уровне (уровень представления какявляется контроллером в проекте MVC) он никогда не должен заботиться о том, как вызвать Сервис, и что пользователь использует ServiceA
вместо ServiceB
... Что нужно знать, так это то, что вызов IService.ListAllProjects()
даст правильныйрезультаты.
Вы начинаете разделять предложения, и если возникает проблема с подключением службы, вы знаете, что это не имеет никакого отношения к слою презентации, это уровень службы (в моем случае), и его легко исправить и можно легкоразвернул новый service.dll
вместо публикации всего сайта снова ...
У меня также есть помощник, который содержит все Business Objects , которые я использую во всех проектах.
Надеюсь, это поможет.