2010-09-17 2 views
6

Я занимаюсь этим неделями. В настоящее время я проектирую свободно-связанную архитектуру с использованием метода n-уровневого (трехслойного) и заводского дизайна. Моя цель - разместить бизнес-логику каждого клиента (ClientA.DLL, ClientB.DLL) в отдельных пространствах имен, чтобы проект масштабировался, что означает, что я могу изменять/удалять/добавлять бизнес-логику конкретного клиента, не затрагивая других, потому что они не зависят друг от друга. Затем я вызываю пространство имен/класс клиента, используя уникальный идентификатор клиента (строковое значение, поддерживаемое в базе данных) через пространство имен Factory. Factory.DLL также скрывает логику для каждого клиента, в то время как BusinessAbstract.DLL служит в качестве макета или шаблона, который будут использоваться классами для каждого клиента.Создание слабосвязанной/масштабируемой архитектуры программного обеспечения

Вот решение проекта:

alt text

А вот фактический код:

BusinessAbstract.DLL

namespace BusinessAbstract 
{ 
    // the entity/data transfer object 
    public class MemberDTO 
    { 
     public string MemberID { get; set; } 
     public string MemberName { get; set; } 
    } 

    // the interface 
    public interface IMaintainable 
    { 
     void Add(); 
     void Edit(); 
     void Delete(); 
    } 

    // the base abstract class, implements the Entity and the Interface 
    public abstract class Member : MemberDTO, IMaintainable 
    { 
    // Implement IMaintanable but change it to abstract 
    public abstract void Add(); 
    public abstract void Edit(); 
    public abstract void Delete(); 

    // a method with Database access, get from DAL 
    public virtual MemberDTO GetMemberDetails(params object[] args) 
    { 
     return DAL.MemberDAL.FetchMemberDetails(args); 
    } 

    public virtual string GetClientBLL() 
    { 
     return "base's method"; 
    } 
    } 
} 

Clientâ реализация AbstractBusinessRule

ClientA.DLL

namespace ClientA 
{ 
    public class _Member : BusinessAbstract.Member 
    { 
     public override void Add() 
     { 
     throw new NotImplementedException(); 
     } 

     public override void Edit() 
     { 
     throw new NotImplementedException(); 
     } 

     public override void Delete() 
     { 
     throw new NotImplementedException(); 
     } 

     public override string GetClientBLL() 
     { 
     return "ClientA Method"; 
     } 
    } 
} 

Фабрика

Factory.DLL реализация

public static class Invoker 
{ 
    public static T GetMemberInstance<T>(string clientCode) 
     where T : Member, IMaintainable 
     { 
     Type objType = Type.GetType(clientCode + "._Member," + clientCode); 
     return (T)Activator.CreateInstance(objType); 
     } 
    } 

образца на уровне представления

Веб-сайт

protected void Page_Load(object sender, EventArgs e) 
{ 

    // invoke Member class using String hardcode 
    Member obj = Invoker.GetMemberInstance<Member>("ClientA"); 
    Response.Write(obj.GetClientBLL()); //prints clientA method 

    obj = Invoker.GetMemberInstance<Member>("ClientB"); 
    Response.Write(obj.GetClientBLL()); //prints clientB method 

} 

И вы также заметите, что у меня есть папка DAL в каждой из библиотек DLL клиента, а также AbstractBusinessRule DLL, потому что я хочу, чтобы масштабировать DAL слой и использовать структуру слоя «UI-BLL -DAL «.

Любые комментарии/предложения по поводу этого дизайна приветствуются. Я надеюсь получить информацию о том, как я могу улучшить эту структуру. Заранее спасибо.

+0

Может ли кто-нибудь сказать мне, является ли объект домена более или менее распространенным термином, чем DTO? Я просто спрашиваю, потому что раньше я никогда не слышал о DTO, но большинство людей знают, что я имею в виду, когда я говорю объект домена, и я думаю, что это то, что DTO .. ​​ –

+0

Да, я думаю, что это просто имя старой школы для домена/Бизнес-объект или объект. Объект Value, который есть. – CSharpNoob

+2

DTO == объект передачи данных, но я не думаю, что OP использует его таким образом вообще. Специально рассматривая DTO, как правило, не делают ничего, кроме хранения данных, которые должны быть переданы, поэтому его не так, как вы вкладываете в него бизнес-логику или начинаете с него операции сохранения. – eglasius

ответ

0

У вас есть основное нарушение принципа разделения ответственности/единственной ответственности: ваши бизнес-объекты знают об их хранении.

Уровень данных трехуровневой архитектуры должен отвечать за операции CRUD и должен запрашиваться для экземпляров объектов, которым нужны пользователи. Что-то вроде этого:

Presentation Layer ------- Data Layer 
           || 
           || 
         Business Layer 

Это позволяет бизнес-слою сфокусироваться на реализации и устраняет проблемы сохранения. Если для уровня представления требуется новый бизнес-объект (для создания), он запрашивает для него слой данных.

+3

Мое понимание архитектуры 3-х уровневого уровня - презентация - бизнес-данные, доступ к PL напрямую к слою данных. В моем примере DataObject (MemberDTO) является объектом, который обменивается данными с PL на DAL, ему не нужно создавать новый бизнес-объект (для создания) как то, что вы говорите.спасибо за вход ^^ – CSharpNoob

+1

3 уровня архитектуры, как правило, означает, что есть уровень Presentation, Business и Data. Он обычно строится так, как вы есть, но, как вы видите, в бизнес-слое есть смешение проблем, которое, безусловно, является наиболее важной частью, чтобы получить право. Чем меньше кода вы можете вставить во что-то, тем вероятнее, что оно будет правильным. – arootbeer

0

Моим первым комментарием было бы то, что ваши имена должны быть более описательными.Совершенно очевидно, что ваша программа действительно делает, глядя на схему решения. Если вы дадите своим классам клиентов и значимым именам рабочего пространства, это будет шагом в правильном направлении.

+0

Я думаю, что имена - это просто примеры, иллюстрирующие точку. :) – bzlm

0

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

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

Его очень сложно рассказать с объемом предоставленной информации, но рассмотрите альтернативу использования более основанного на конфигурации подхода/не означает конфигурационные файлы, а просто конфигурации, которые передаются в систему.

У вас может быть набор основных правил и настройка по умолчанию, которая применяет набор этих правил к клиенту. Если вы делаете это в коде, при добавлении конфигурации клиента вы можете просто сказать .AddClient («ClientA»), и он будет использовать только правила по умолчанию.

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

У клиентаA может быть необходимость, которая не включена в основные правила, тогда к процессу клиента может применяться бизнес-правило пользовательского/кодового.

Я бы не попытался сделать переход до такого универсального фреймворка. Вместо этого я бы сосредоточил внимание на конкретных процессах и выставил точки расширения для них. Когда вы работаете в решении, должны появляться общие шаблоны, а затем, при необходимости (реальная выгода), вы можете реорганизовать его на нечто более общее.

1

Единственное, что я вижу, и я туман, просто пропущу это, глядя на ваше сообщение, но я не вижу определения интерфейса DAL или слоя абстракции, который отделяет его от вашего BL в том, как ваш BL абстрагируется от вашей презентации.

Это важно, потому что это дает вам гибкость в будущем для создания нового бизнес-уровня с использованием тех же данных без необходимости переписывать DAL или заменять вашу базу данных плоскими CSV-файлами/mocks при модульном тестировании/стороннем поддерживаемый ответ на веб-сервисы мыла или что-то еще может быть лучшим механизмом хранения данных в будущем.

+0

YEs DAL тесно связан с BL, потому что клиенты имеют различную реализацию в DAL, и его трудно сделать реферат для этого, потому что клиент из-за этого. но я бы взял Идею также абстрагировать DAL от BL. спасибо за вход ^^ – CSharpNoob

+0

@CSharpNoob: И именно поэтому вам нужен слой абстракции DAL. Таким образом, клиенты могут иметь различные реализации DAL, без необходимости использовать разные клиенты для разных DAL. Один клиент, который поддерживает то же самое на интерфейсе DAL, будет делать разные вещи в зависимости от экземпляра DAL, который вы передали этому клиенту. Это позволяет одному клиенту работать против множества реализаций DAL. Для вашей жесткой связи потребуется несколько клиентских реализаций для нескольких реализаций DAL. –

+0

спасибо Джимми, я думаю, мне нужно это рассмотреть. – CSharpNoob

Смежные вопросы