N层对象参数

时间:2016-08-11 13:18:07

标签: c# asp.net n-tier-architecture

我在n层概念上苦苦挣扎。起初我有这个概念,我的域实体将在我的3层共享(DAL,BLL,Service)。但最近被告知这是一个古老的概念,并没有真正遵循SOLID概念。而是被告知为每一层创建和对象。

Service
  ObjectService
Business
  ObjectBus
DAL
  Object

哪些是服务仍取决于业务,业务取决于dal等。但是我不确定如何传递我的对象或如何创建它们。

让我们说在我的数据层我有一个具有以下属性的person.cs

public class Person:Base
{
    public string firstName { get; set; }
    public string lastName { get; set; }
    public string middleName { get; set; }
}

在我的业务对象中,我应该创建一个像这样的业务方法

Boolean CreatePerson(userrole r,string f, string l, string m);

或者我应该做这样的事情

Boolean CreatePerson(PersonHandler pmo);

我有一个PersonH​​andler类

public class PersonHandler
{
    public UserRole r { get; set; };
    public Person p { get; set; };
}

在这种情况下,userrole只是业务层所需的额外属性。我喜欢为业务层创建一个对象,因为我可以更容易地更改与该对象关联的所有属性,但是我觉得我仍然需要访问域实体(Person),我被告知这很糟糕。但是,如果我为每个对象创建一组属性,我觉得这将是多余的。如果将来我在DAL改变我的人,那不就意味着我必须改变所有参数上升的参数吗?

这里有一个更详细的结构文件夹

enter image description here

这是我的DAL结构。

enter image description here

2 个答案:

答案 0 :(得分:0)

请注意,Person类型特定于数据层。业务层(和其他人)不知道Person是什么。业务层有自己的“人”概念,应该有一个单独的类,可能还有你可能需要的任何额外属性。这就是拥有多层的重点。

现在,您无法直接在图层之间移动对象。您需要在相邻图层之间放置一个映射器,例如,DataLayer.Person会将其转换为BusinessLayer.Person

您可以构建自己的映射器,也可以使用AutoMapper等工具。

答案 1 :(得分:0)

你的结构似乎完全矫枉过正。您声明您正在使用实体框架。这是一个ORM,它应该将业务实体/对象映射到数据结构,并且应该这样使用。

为什么不首先使用EF代码创建域,并使用属性将域实体映射回sql表?我假设后端有sql。将您的业务逻辑保留在您的域模型中,否则您有可能创建anemic mode l

对于前端,我将定义视图模型,这些视图模型表示您向用户呈现的屏幕/视图,因为它与域对象分开。然后从域对象中填充视图模型。