我有一个关于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最常见的示例用法.
我正在构建一个Web应用程序,我想扩展到许多用户.此外,我需要通过Web服务向受信任的第三方公开功能.
我正在使用LLBLGen生成数据访问层(使用SQL Server 2008).目标是构建一个业务逻辑层,使Web应用程序不受DAL细节的影响,当然,还要提供超出DAL的额外级别的验证.此外,就我现在所知,Web服务基本上是BLL的薄包装.
当然,DAL有自己的一组实体对象,例如CustomerEntity,ProductEntity等.但是,我不希望表示层直接访问这些对象,因为它们包含DAL特定方法,并且程序集特定于DAL,依此类推.因此,我们的想法是创建数据传输对象(DTO).我们的想法是,这些本质上是普通的旧C#/ .NET对象,它们拥有CustomerEntity的所有字段,实际上是数据库表Customer,但没有其他东西,除了一些IsChanged/IsDirty属性.所以,会有CustomerDTO,ProductDTO等.我认为这些将继承自基础DTO类.我相信我可以使用LLBLGen的一些模板生成这些,但我还不确定.
因此,想法是BLL将通过接受和返回这些DTO对象来公开其功能.我认为Web服务将处理将这些对象转换为使用它的第三方的XML,许多可能不使用.NET(也有些东西可以通过Web应用程序使用JSON从AJAX调用调用脚本).
我不确定设计这个以及如何前进的最佳方式.以下是一些问题:
1)如何向客户端公开(表示层和Web服务代码)
我在想有一个公共类有这些方法,每次调用都是一个原子操作:
InsertDTO,UpdateDTO,DeleteDTO,GetProducts,GetProductByCustomer等等......
然后客户端将调用这些方法并传入适当的参数,通常是DTO.
这是一个好的,可行的方法吗?
2)从这些方法返回什么?显然,Get/Fetch类方法将返回DTO.但是Inserts呢?签名的一部分可能是:
InsertDTO(DTO dto)
但是,插入什么时应该返回?我希望收到错误通知.但是,我对某些表使用自动增量主键(但是,有些表具有自然键,特别是多对多表).
我想到的一个选项是Result类:
class Result
{
    public Exception Error {get; set;}
    public DTO AffectedObject {get; set;}
}
因此,在插入上,DTO将获取其get ID(如CustomerDTO.CustomerID)属性集,然后放入此结果对象.如果Result.Error!= null,客户端将知道是否存在错误,然后它将知道Result.AffectedObject属性中的ID.
这是一个好方法吗?一个问题是它似乎传递了大量来回的冗余数据(当它只是ID时).我不认为添加"int NewID"属性是干净的,因为一些插入不会有这样的自动增量键.另一个问题是我认为Web Services不会很好地处理这个问题吗?我相信他们只会在Result类中返回AffectedObject的基础DTO,而不是派生的DTO.我想我可以通过拥有大量不同类型的Result对象(可能从基础Result派生并继承Error属性)来解决这个问题,但这似乎不是很干净.
好吧,我希望这不是太冗长,但我想说清楚.
我以前从未使用过实体框架,我想尝试一些实现它的个人项目来让我的脚湿透.
我看到实体可以暴露给表示层.但我不希望暴露某些字段,修改日期和创建日期等字段以及各种其他数据库字段.
我怎么能实现业务对象,只是暴露我需要的属性,但仍然保持对象可序列化?
这对LinqToSql有什么优势?
我是ASP.Net MVC的初学者.在阅读了许多教程并消化其概念之后,我还没有看到一种方法可以清楚地说明业务逻辑的去向.
我的应用程序将大量使用jQuery AJAX用法(它将调用Controller的Actions用于各种目的,例如依赖交互,验证).我肯定会使用ViewModel概念,但我仍然不清楚业务逻辑应该驻留在哪里.我不想放入控制器或模型.我应该把它放在一个单独的服务层吗?
我去接受采访,并被要求出示我的业务层架构.我对3层架构有一些了解,但实际上不知道在面试官面前写什么.因此,假设我的项目涉及组织的员工,那么我会在那里写什么.它是我应该制作的任何类型的图表还是某些编码部分.我在C#framework 3.5工作.我真的不明白这个问题还有什么要提,所以如果需要的话请告诉我.谢谢.
编辑 我在winforms工作.我知道什么是业务层,但不知道告诉面试官什么,因为业务层有代码,显然我的项目有点大,所以有大量的代码.那我应该写在那里?
这是此问题的特定版本.
我想检查是否插入了重复的行.我应该在我的应用程序层中以编程方式检查它:
if (exists(obj))
{
    throw new DuplicateObjectException();
}
HibernateSessionFactory.getSession().save(obj);
或者我应该捕获数据库层抛出的异常并在违反约束时触发?
try
{
    HibernateSessionFactory.getSession().save(obj);
}
catch(ConstraintViolationException e)
{
    throw new DuplicateObjectException();
}
编辑:换句话说:虽然约束是保留的(无论如何它是好的数据库设计,我不能确定我的应用程序将是访问该表的唯一一个)我是否应该依赖约束并处理它的违规异常会提高,或者我最好还是检查一下?
EDIT2:当然我在一个事务中检查+插入,锁定表以确保在此期间没有其他进程正在写另一个记录
我不确定在哪里放置我的业务逻辑.我有一个WCF服务,它的方法暴露给我的客户端.
我的业务逻辑应该采用服务方法吗?
public User GetUser(int id)
{  
     //Retrieve the user from a repository and perform business logic
     return user;
}
或者它应该在一个单独的类中,每个WCF服务方法将依次调用业务层方法.
public User GetUser(int id)
{  
     return _userLogic.GetUser(id);
}
我有用户和角色实体和服务,DAO层.我需要来自UserService的角色列表.
我应该从UserService使用哪一层?RoleService与RoleDAO的调用列表方法?哪一个是常用的,为什么?
我有一种情况,我想使用单个业务逻辑类在各种实体框架类上执行类似的操作.我已经定义了这些类在部分类文件中实现的接口.
但是,当我尝试针对这些接口方法编写LINQ to entities查询时,我得到一个NotSupportedException,因为查询没有直接使用类的属性,而是通过接口.
我想将繁重的工作保留到数据库层,那么有没有办法实现这一点而无需诉诸LINQ对象?
下面是一些演示我的问题的代码(它使用的是工厂创建的通用存储库类).
public interface INamedEntity
{
    int ID { get; set; }
    string Name { get; set; }
}
// This is an Entity Framework class which has CustomerID and CustomerName properties.
public partial class Customer: INamedEntity
{
    int INamedEntity.ID
    {
        get { return this.CustomerID; }
        set { this.CustomerID = value; }
    }
    string INamedEntity.Name
    {
        get { return this.CustomerName; }
        set { this.CustomerName = value; }
    }
}
...
public string GetName<T>(int entityID) where T: …我想将数据层与业务逻辑和业务逻辑从GUI分离.潜入网络我偶然发现了一些资源,但仍无法让我清醒.有些人谈论的模式,其他人指出各种框架.我的要求是:
我需要的是:
delphi orm user-interface business-logic-layer business-objects