2016-08-11 84 views
0

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

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

+0

很明显,使用'Boolean CreatePerson(userrole r,string f,string l,string m)'这样的方法是个坏主意。使用DAL层clases作为BL中的输入参数应该不成问题。 – Vladimir

+0

你怎么做你的数据访问? entity frameowrk,nhibernate,orm?你在做cqrs吗? – Fran

+0

我正在使用实体框架 – Jseb

回答

0

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

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

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

+0

因为我使用的是Entity Framework,所以建议我创建一个具有poco对象的域图层,并且可以在图层之间进行共享?我被告知这不是固定的,因为程序员可以以某种方式直接从服务层设置它(我的理解) – Jseb

+0

我们还希望有一个DAL可以使ORM保持回购模式,这是因为回购更容易注入/模拟而不在整个业务层上对ORM(EF/NHibernate或其他)产生任何依赖关系。从理论上讲,ORM可以帮助您轻松地将RDBMS替换为其他类型,但实际上并非如此,有时甚至需要针对性能或任何原因破解一些实际的SQL,并直接在内部使用ORM框架您的业​​务层意味着您将最终编写SQL代码。 – Groo

+0

我也在我的域对象周围使用了这个确切的原因。你可以用映射拆分poco对象以更好地分离,并将自定义sql放置在映射中,但是在数据访问级别上没有完整的单独Person,这里有一个PersonMap映射对象。 – Fran

0

注意,Person类型是特定的数据层。业务层(和其他人)不知道什么是Person。业务层有它自己的“人”的想法,应该有一个单独的类,可能有任何额外的属性,你可能想要的。这是多层次的关键。

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

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

+1

如果业务层依赖于DAL,业务层可能会*知道*什么是Person。 – Groo

+0

如果您正在使用EF,那么应该照顾您将业务人员映射到sql表格。为什么你需要一个数据层的人? – Fran

+0

Friom这种方法似乎有道理,我会创建一个名为Automapper的文件夹,并在里面看到PersonMap类,它允许我直接与dal交谈并映射它 – Jseb