加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – ASP.NET MVC:BLL和DAL到Repository设计

发布时间:2020-12-16 09:59:36 所属栏目:asp.Net 来源:网络整理
导读:我们正在从ASP.NET Web Forms迁移到MVC 2.0.在我们的大多数项目中,我们都有一个与数据库通信的典型设置. 常见(像’SiteMenu’和’用户’这样的对象/实体) 业务逻辑层(调用de数据访问层) 数据访问层 DAL有一个具有通用数据库操作的DatabaseHelper,一个具有数
我们正在从ASP.NET Web Forms迁移到MVC 2.0.在我们的大多数项目中,我们都有一个与数据库通信的典型设置.

常见(像’SiteMenu’和’用户’这样的对象/实体)

业务逻辑层(调用de数据访问层)

数据访问层

DAL有一个具有通用数据库操作的DatabaseHelper,一个具有数据库特定操作的OdbcHelper(例如MySQL)和一个包含所有存储过程的StoredProcedure类.

这个设计如何转化为存储库设计?我们想使用自己的数据库助手而不是NHibernate等.

你会建议什么?

解决方法

您可以使用每种数据访问技术来利用存储库.
存储库是对现有数据访问助手/服务的抽象,允许业务逻辑与数据访问层分离.存储库与Query一起使用以启用过滤.它通常与工作单元一起使用,以将更改存储回数据库.

存储库至少有:

> Get-object-by-key操作
> Get-all-objects操作
> Get-first-object-by-query操作
>按查询对象获取操作

一个非常简单的例子:):

A.产品类,在Common中定义:

public class Product
{
    public int Id { get; private set; }

    public string Code { get; set; }

    public string Name { get; set; }

    public decimal Price { get; set; }
}

B. Query,IRepository和IUnitOfWork的类在DAL.interfaces.dll或Common.dll中定义(但不在DAL中!).

public class Query
{
    public string Text { get; set; }
}

public interface IRepository<TEntity>
    where TEntity : class
{
    bool TryGet(int key,out TEntity value);

    TEntity this[int key] { get; }

    IEnumerable<TEntity> GetAll();

    bool TryGetFirst(Query condition,out TEntity value);

    TEntity GetFirst(Query condition);

    IEnumerable<TEntity> GetAll(Query condition);

    int Count { get; }
}


public interface IUnitOfWork
{
    void SetAdded(TEntity value); // Marks entity as added for further INSERT

    void SetRemoved(TEntity value); // Marks entity as removed for further DELETE

    void SetChanged(TEntity value); // Marks entity as modified for further UPDATE

    void Save(); // Save all the changes 
}

IUnitOfWork了解已更改的实体. Save()为每个更改的实体调用适当的DatabaseHelper / OdbcHelper CRUD方法,以便在数据库中保留更改.

IRepository< Product>,… IRepository< EntityXY>的实现和IUnitOFWork应放在DAL中.然后,BLL使用IRepository和IUnitOFWork来实现业务(域)逻辑. BLL本身可以组织为域模型顶部的服务层,但它超出了讨论的范围:).

我希望我的回答有所帮助.

请随时问我一个问题……

链接:
Patterns of enterpise application architecture by Martin Fowler

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读