我在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);
我有一个PersonHandler类
public class PersonHandler
{
public UserRole r { get; set; };
public Person p { get; set; };
}
在这种情况下,userrole只是业务层所需的额外属性。我喜欢为业务层创建一个对象,因为我可以更容易地更改与该对象关联的所有属性,但是我觉得我仍然需要访问域实体(Person),我被告知这很糟糕。但是,如果我为每个对象创建一组属性,我觉得这将是多余的。如果将来我在DAL改变我的人,那不就意味着我必须改变所有参数上升的参数吗?
这里有一个更详细的结构文件夹
这是我的DAL结构。
答案 0 :(得分:0)
请注意,Person
类型特定于数据层。业务层(和其他人)不知道Person
是什么。业务层有自己的“人”概念,应该有一个单独的类,可能还有你可能需要的任何额外属性。这就是拥有多层的重点。
现在,您无法直接在图层之间移动对象。您需要在相邻图层之间放置一个映射器,例如,DataLayer.Person
会将其转换为BusinessLayer.Person
。
您可以构建自己的映射器,也可以使用AutoMapper等工具。
答案 1 :(得分:0)
你的结构似乎完全矫枉过正。您声明您正在使用实体框架。这是一个ORM,它应该将业务实体/对象映射到数据结构,并且应该这样使用。
为什么不首先使用EF代码创建域,并使用属性将域实体映射回sql表?我假设后端有sql。将您的业务逻辑保留在您的域模型中,否则您有可能创建anemic mode l
对于前端,我将定义视图模型,这些视图模型表示您向用户呈现的屏幕/视图,因为它与域对象分开。然后从域对象中填充视图模型。