我正在研究POCO和DTO之间的差异(似乎POCO与行为有关(方法?))并且Martin Fowler在贫血领域模型上发现了这篇文章.
由于缺乏理解,我认为我已经创建了这些贫血领域模型之一.
在我的一个应用程序中,我将业务域实体定义为'dto'dll.他们有很多属性,包括getter和setter,而不是其他.我的业务逻辑代码(填充,计算)位于另一个"bll"dll中,我的数据访问代码位于"dal"dll中.我认为'最佳实践'.
所以通常我会像这样创建一个dto:
dto.BusinessObject bo = new dto.BusinessObject(...)
Run Code Online (Sandbox Code Playgroud)
并将其传递给bll层,如下所示:
bll.BusinessObject.Populate(bo);
Run Code Online (Sandbox Code Playgroud)
反过来,它执行一些逻辑并将其传递给dal层,如下所示:
dal.BusinessObject.Populate(bo);
Run Code Online (Sandbox Code Playgroud)
根据我的理解,为了使我的dto成为POCO,我需要将业务逻辑和行为(方法)作为对象的一部分.所以代替上面的代码更像是:
poco.BusinessObject bo = new poco.BusinessObject(...)
bo.Populate();
Run Code Online (Sandbox Code Playgroud)
即.我在对象上调用方法而不是将对象传递给方法.
我的问题是 - 我怎么能这样做,仍然保留关注点的'最佳实践'层次(单独的dll等...).不调用对象上的方法意味着必须在对象中定义方法?
请帮助我的困惑.
我对感知"最佳实践"感兴趣,在这里用一点点现实来锻炼.
在Web应用程序中,您是否允许您的Web层直接访问DAL,还是应该首先通过BLL?
我特别谈的是没有真正涉及"业务逻辑"的场景 - 比如一个简单的查询:"获取姓氏为'Atwood'的所有客户".那些有任何逻辑的场景绝对会通过BLL,所以我们称之为moo.
虽然您可以将此方法封装在BLL对象中,但是当签名与DLL对象的签名完全相同时,似乎有点无意义,并且代码可能与将查询委派给DLL的一个简单的代码一样简单.
如果选择前者 - 使用BLL对象 - 你称这些对象是什么?(假设它们只是在DLL中提供查询层).助手?QueryProviders?
想一想.
问候
马蒂
我有一个关于Dapper的基本逻辑问题.
在尝试做最好的设计实践时,Dapper是否模糊了DAL和BLL之间的界限?许多建议是DAL应该对BLL一无所知,并且DAL应该只返回BLL应该转换为某些有用对象的一些blob数据.
我想在这里得到一些专家对Dapper适合的意见.
这是一个伟大的项目,并且运作良好,但它似乎与BLL紧密结合.我个人并不反对这种方法,但是想知道1)是否有更好的方法可以解开Dapper和BLL,或2)如果它不是真正的问题,因为我们不打算离开MS SQL.
谢谢.
编辑:回应马克的评论:
Dapper是一个很棒的产品,这不是对它的任何影响......我的意思是,当你执行一个查询时,它通常会返回一个特定类型的集合.
var dog = connection.Query<Dog>("select Age = @Age, Id = @Id", new { Age = (int?)null, Id = guid });
在这种情况下,查询将返回Dog的集合.
如果Dapper部署在DAL层中,则必须具有对BLL层的引用,以便了解它将返回的对象类型.
许多建议是DAL永远不应该知道关于BLL的任何信息.我只是试图确定部署Dapper和保持良好的N层设计结构的最佳实践.
我知道它有点主观,但如果它足以支持Stack Overflow,那么你们都必须找到在设计良好的环境中部署它的最佳实践方法.
编辑:注意到由于HTML符号,查询示例中未显示"Dog"的类型.
再次编辑以响应Hogan的评论:我的问题的核心与上面的代码行将在DAL中的想法更相关.为清楚起见,我们可以假设我们有一个DAL和BLL作为单独的类项目的解决方案.现在,当这行代码进入DAL项目时,DAL必须引用BLL来获取"Dog"对象.这种交叉依赖性可以吗?或者只是最常用的Dapper?或者这是一种不好的做法,而不是使用Dapper的最佳方式?我知道很多'纯粹主义者'会说DAL不应该知道关于BLL的任何事情......依赖于上面一行中的"Dog"对象会违反这个原则.但是,上面的行似乎是Dapper最常见的示例用法.
有此DAL/BLL设计建议为ASP.NET(2.0)应用由微软.我知道一些替代方案,我在这里已经阅读了相关问题.但是我想知道这个提议的解决方案现在是否值得实施,你知道的是否有一个特定的缺点?
我想开发DAL/BLL组件以供公司内部使用,从各种应用程序和脚本访问客户和员工数据等.然而,在我开始构建这些东西之前,我想确保这个解决方案是"好的".例如,BLL传递数据表而不是封装任何东西,您没有包含逻辑的隔离业务对象.它基本上只是一个愚蠢的层,可以简化CRUD操作并允许控件的数据绑定.
在这个领域有经验的人能否指出我对这种方法的赞成和反对意见?
我目前有一个应用程序,它包括:用户界面(网页)BLL(管理器和域对象)DAL(我的每个域对象的DataAccess类).
我在UI中使用以下内容来搜索域对象.
protect sub Button1_Click()
{
IBook book = BookManager.GetBook(txtID.Text);
}
Run Code Online (Sandbox Code Playgroud)
这是我的BLL
public class BookManager
{
public static IBook GetBook(string bookId)
{
return BookDB.GetBook(bookId);
}
}
public class Book : IBook
{
private int? _id
private string _name;
private string _genre;
public string Name
{
get { return _name; }
private set
{
if (string.IsNullOrEmpty(value))
throw new Exception("Invalid Name");
_name = value;
}
}
public string Genre
{
get { return _serial; }
private set
{
if (string.IsNullOrEmpty(value))
throw new …
Run Code Online (Sandbox Code Playgroud) 解决方案设置
假设我有一个Customer实体,它是:
BLL和DAL应该用什么类型的对象进行通信 - DataTable
或者List<Customer>
(例如)?在第一种情况下,BLL逻辑应将Customer对象转换为DataTable并将其发送到DAL.在secod的情况下,DAL层应该知道Customer层,它位于BLL层中.但原始DLL引用DAL而不是相反......
我是否应该将所有类放入单独的程序集中,这是由所有其他类引用的(Common,BusinessObjects,...)?在这种情况下,我可以在所有项目中使用Customer类.
我知道,当我知道只有一个BLL会使用我的DAL时,我是否应该费心去分离DAL和BLL.在这种情况下,我可以将它们合并为一个项目.
PS - 我正在阅读关于DataTables的内容,很多人说我们根本不应该使用它们.有什么更好的选择?也许现在是我学习一些ORM映射工具的时候了:)
您最喜欢的业务逻辑层(BLL)开发工具包是什么?有没有?
BLL工具包是一组处理典型业务逻辑场景的类(控件,VS.NET加载项).例如,实现访问控制,提供验证等.当然,恕我直言.
我正在从头开始研究一个小应用程序并用它来尝试自学架构和设计概念.它是一个.NET 3.5,WPF应用程序,我使用Sql Compact Edition作为我的数据存储.
我正在研究业务逻辑层,刚刚开始编写DAL.我只是使用SqlCeComamnds发送简单查询和SqlCeResultSet来获得结果.我开始设计我的插入和更新方法,这就是问题 - 我不知道从BLL到DAL获取必要数据的最佳方法.我是否通过了通用收藏?我是否有一个包含数据库所有数据的大量参数列表?我是否只是传入实际的业务对象(从而将我的DAL绑定到BLL中的conrete?).
我想过使用接口 - 简单地将IBusinessObjectA传递给DAL,这提供了我正在寻找的简单性,而不会让我紧紧抓住当前的实现.你们有什么感想?
我已经有了分层数据访问设计,效果很好.但我不知道它是否是最合适的实现.
我只是想知道BLL类或methots应该是静态的还是应该是只有一个实例的concreate类?
与此同时,我不需要序列化BLL类以在这样的SOA设计中使用它.但我不知道这个功能会带来什么.
请查看以下选项:
哪一个最有效率的表现和设计?
编辑:
选项1
public static class BllCustomer
{
public static List<ModelCustomer> GetCustomers()
{
}
}
// usage
BllCustomer.GetCustomers();
Run Code Online (Sandbox Code Playgroud)
选项2
public class BllCustomer
{
public static List<ModelCustomer> GetCustomers()
{
}
}
// usage
BllCustomer.GetCustomers();
Run Code Online (Sandbox Code Playgroud)
2选项
public class BllCustomer
{
public List<ModelCustomer> GetCustomers()
{
}
}
// usage
BllCustomer bllCustomer = new BllCustomer();
bllCustomer.GetCustomers();
Run Code Online (Sandbox Code Playgroud)
3选项
public class BllCustomer
{
public List<ModelCustomer> GetCustomer()
{
}
}
// usage
public static BllCustomer s_BllCustomer = new …
Run Code Online (Sandbox Code Playgroud)