【发布时间】:2011-04-13 20:43:53
【问题描述】:
我已经研究了好几个星期了。我目前正在使用 n 层(3 层)方法和工厂设计方法设计一个松散耦合架构设计。我的目标是将每个客户端的业务逻辑(ClientA.DLL、ClientB.DLL)放在单独的命名空间中,以便项目扩展,这意味着我可以修改/删除/添加特定客户端的业务逻辑而不影响其他客户,因为它们是不相互依赖。然后我通过 Factory 命名空间使用客户端的唯一标识符(数据库中维护的字符串值)调用客户端的命名空间/类。 Factory.DLL 还隐藏每个客户端的逻辑,而 BusinessAbstract.DLL 用作每个客户端的布局或模板类将使用。
这里是项目解决方案:
这是实际的代码:
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";
}
}
}
工厂
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
}
您还会注意到,我在每个客户端 DLL 以及 AbstractBusinessRule DLL 中都有一个 DAL 文件夹,因为我还想缩放 DAL 层并使用层结构“UI-BLL-DAL”。
欢迎任何有关此设计的 cmets/建议。我希望就如何改进这种结构提供意见。提前致谢。
【问题讨论】:
-
谁能告诉我域对象是否比 DTO 更常见?我只是问,因为我以前从未听说过 DTO,但是当我说域对象时,大多数人都知道我的意思,我认为这就是 DTO 的含义..
-
是的,我认为这只是域/业务对象或实体的老派名称。它是值对象..
-
DTO == 数据传输对象,但我认为 OP 根本没有这样使用它。特别是考虑到 DTO 通常除了保存要传递的数据之外做的事情不多,所以它不像您将业务逻辑放在那里或从中启动持久性操作。
-
我只是将它附加到真正的业务对象上,因为您可以看到业务对象(Member)除了持有操作之外,还可以在层之间传递数据,因为它继承了MemberDTO。 ,我会说它有点非正统的方法虽然^^
-
DTO 经常被用作层间的传递;一个示例是视图在 MVVM 中呈现(或传递回模型)的 ViewModel。它是模型中某些数据子集的位桶表示,用于其他目的。
标签: c# .net design-patterns architecture