标签: business-logic-layer

与n层设计(BLL/DAL)相关的小巧玲珑

我有一个关于Dapper的基本逻辑问题.

在尝试做最好的设计实践时,Dapper是否模糊了DAL和BLL之间的界限?许多建议是DAL应该对BLL一无所知,并且DAL应该只返回B​​LL应该转换为某些有用对象的一些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最常见的示例用法.

business-logic-layer data-access-layer bll dapper

11
推荐指数
1
解决办法
3175
查看次数

如何在业务逻辑层中设计数据传输对象

DTO

我正在构建一个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)
Run Code Online (Sandbox Code Playgroud)

但是,插入什么时应该返回?我希望收到错误通知.但是,我对某些表使用自动增量主键(但是,有些表具有自然键,特别是多对多表).

我想到的一个选项是Result类:

class Result
{
    public Exception Error {get; set;}
    public DTO AffectedObject {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

因此,在插入上,DTO将获取其get ID(如CustomerDTO.CustomerID)属性集,然后放入此结果对象.如果Result.Error!= null,客户端将知道是否存在错误,然后它将知道Result.AffectedObject属性中的ID.

这是一个好方法吗?一个问题是它似乎传递了大量来回的冗余数据(当它只是ID时).我不认为添加"int NewID"属性是干净的,因为一些插入不会有这样的自动增量键.另一个问题是我认为Web Services不会很好地处理这个问题吗?我相信他们只会在Result类中返回AffectedObject的基础DTO,而不是派生的DTO.我想我可以通过拥有大量不同类型的Result对象(可能从基础Result派生并继承Error属性)来解决这个问题,但这似乎不是很干净.

好吧,我希望这不是太冗长,但我想说清楚.

c# business-logic-layer llblgenpro dto

10
推荐指数
1
解决办法
6483
查看次数

实体框架和业务对象

我以前从未使用过实体框架,我想尝试一些实现它的个人项目来让我的脚湿透.

我看到实体可以暴露给表示层.但我不希望暴露某些字段,修改日期和创建日期等字段以及各种其他数据库字段.

我怎么能实现业务对象,只是暴露我需要的属性,但仍然保持对象可序列化?

这对LinqToSql有什么优势?

c# entity-framework business-logic-layer business-objects

10
推荐指数
2
解决办法
6272
查看次数

业务逻辑在MVC中的位置在哪里?

我是ASP.Net MVC的初学者.在阅读了许多教程并消化其概念之后,我还没有看到一种方法可以清楚地说明业务逻辑的去向.

我的应用程序将大量使用jQuery AJAX用法(它将调用Controller的Actions用于各种目的,例如依赖交互,验证).我肯定会使用ViewModel概念,但我仍然不清楚业务逻辑应该驻留在哪里.我不想放入控制器或模型.我应该把它放在一个单独的服务层吗?

asp.net-mvc business-logic-layer asp.net-mvc-3

10
推荐指数
2
解决办法
5988
查看次数

3层架构中的业务层

我去接受采访,并被要求出示我的业务层架构.我对3层架构有一些了解,但实际上不知道在面试官面前写什么.因此,假设我的项目涉及组织的员工,那么我会在那里写什么.它是我应该制作的任何类型的图表还是某些编码部分.我在C#framework 3.5工作.我真的不明白这个问题还有什么要提,所以如果需要的话请告诉我.谢谢.

编辑 我在winforms工作.我知道什么是业务层,但不知道告诉面试官什么,因为业务层有代码,显然我的项目有点大,所以有大量的代码.那我应该写在那里?

business-logic-layer 3-tier n-tier-architecture

9
推荐指数
1
解决办法
2万
查看次数

逻辑:数据库或应用程序/ 2(约束检查)

这是此问题的特定版本.
我想检查是否插入了重复的行.我应该在我的应用程序层中以编程方式检查它:

if (exists(obj))
{
    throw new DuplicateObjectException();
}
HibernateSessionFactory.getSession().save(obj);
Run Code Online (Sandbox Code Playgroud)

或者我应该捕获数据库层抛出的异常并在违反约束时触发?

try
{
    HibernateSessionFactory.getSession().save(obj);
}
catch(ConstraintViolationException e)
{
    throw new DuplicateObjectException();
}
Run Code Online (Sandbox Code Playgroud)

编辑:换句话说:虽然约束是保留的(无论如何它是好的数据库设计,我不能确定我的应用程序将是访问该表的唯一一个)我是否应该依赖约束并处理它的违规异常会提高,或者我最好还是检查一下?

EDIT2:当然我在一个事务中检查+插入,锁定表以确保在此期间没有其他进程正在写另一个记录

database business-logic-layer

8
推荐指数
1
解决办法
1200
查看次数

WCF服务和业务逻辑

我不确定在哪里放置我的业务逻辑.我有一个WCF服务,它的方法暴露给我的客户端.

我的业务逻辑应该采用服务方法吗?

public User GetUser(int id)
{  
     //Retrieve the user from a repository and perform business logic
     return user;
}
Run Code Online (Sandbox Code Playgroud)

或者它应该在一个单独的类中,每个WCF服务方法将依次调用业务层方法.

public User GetUser(int id)
{  
     return _userLogic.GetUser(id);
}
Run Code Online (Sandbox Code Playgroud)

wcf business-logic-layer business-logic

8
推荐指数
1
解决办法
4890
查看次数

从另一个服务调用服务vs dao

我有用户和角色实体和服务,DAO层.我需要来自UserService的角色列表.

我应该从UserService使用哪一层?RoleService与RoleDAO的调用列表方法?哪一个是常用的,为什么?

java dao business-logic-layer layer

8
推荐指数
1
解决办法
4070
查看次数

LINQ to Entities通过接口属性

我有一种情况,我想使用单个业务逻辑类在各种实体框架类上执行类似的操作.我已经定义了这些类在部分类文件中实现的接口.

但是,当我尝试针对这些接口方法编写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: …
Run Code Online (Sandbox Code Playgroud)

entity-framework business-logic-layer interface repository

7
推荐指数
2
解决办法
2064
查看次数

有关在Delphi中分离数据访问,业务逻辑和GUI的任何建议

我想将数据层与业务逻辑和业务逻辑从GUI分离.潜入网络我偶然发现了一些资源,但仍无法让我清醒.有些人谈论的模式,其他人指出各种框架.我的要求是:

  • 从rdbms(主要是mysql)操作数据CRUD操作
  • 处理id生成(我应该使用自动增量或提供的数据引擎还是生成的pascal代码)
  • 表关系可能是合乎逻辑的(不使用引用完整性)
  • 需要能够从数据模型生成对象关系
  • 数据必须转换为业务对象和业务逻辑操纵
  • 应使用现有的gui组件或免费软件

我需要的是:

  • 一些基本示例代码/应用程序布局的指导技巧/建议(例如units-classes-modules-directories)...当我不是OOP专家时,我必须设计类层次结构时感到困惑
  • 一个带教程的简单框架
  • 甚至是你自己的日常代码/框架/方法

delphi orm user-interface business-logic-layer business-objects

6
推荐指数
2
解决办法
4106
查看次数