Создание слабосвязанной / масштабируемой программной архитектуры

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

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

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";
    }
   }
 }

ClientA реализация 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";
      }
    }
 }

The Factory

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, а также DLL AbstractBusinessRule, потому что я также хочу масштабировать Слой DAL и использовать структуру слоя «UI-BLL-DAL».

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

7
задан bubbleking 28 May 2017 в 22:07
поделиться