首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通用DAL / BLL类

通用DAL / BLL类
EN

Stack Overflow用户
提问于 2013-02-21 14:10:01
回答 2查看 3.3K关注 0票数 1

我目前正在为我们的新应用程序构建数据访问层和业务逻辑层类,我有一个问题(很明显)。首先,以下是一些可能有帮助的细节:

  • 使用实体框架5进行模型类和数据访问
  • 每个“层”在不同的类库和名称空间(即App.Model、App.DAL、App.BLL)中被分隔开来。

从DAL开始-我决定为所有DAL类编写一个要继承的基类。

代码语言:javascript
复制
public abstract class DALBase<T> : IDisposable
{
    protected AppEntities context;
    protected DbSet set;

    public DALBase()
    {
        context = new OECCORPEntities();
        set = context.Set(typeof(T));
    }

    protected virtual void Save()
    {
        context.SaveChanges();
    }

    public virtual void Add(T model)
    {
        set.Add(model);
        Save();
    }

    public virtual T Get(int id)
    {
        return (T)set.Find(id);
    }

    public virtual List<T> GetAll()
    {
        return set.OfType<T>().ToList();
    }

    public virtual void Delete(int id)
    {
        T obj = Get(id);
        set.Remove(obj);
        Save();
    }

    public virtual void Update()
    {
        Save();
    }

    public void Dispose()
    {
        context.Dispose();
    }
}

正如您将看到的,基类实现了一个泛型类型,它应该是DAL类负责处理的模型的类型。使用泛型类型,在构造函数中,它使用泛型参数的类型创建一个DbSet (在下面的类似于CRUD的预定义虚函数中使用) (add、get等)。

然后我想到了-等一下.因为它是通用的,所以我真的不必为每个模型实现DAL类。我可以写这样的东西:

代码语言:javascript
复制
public class GenericDAL<T> : DALBase<T>
{
    public GenericDAL() : base() {}
}

..。我可以用在任何型号上。好的,接下来是业务逻辑层。我还为BLL创建了一个基类:

代码语言:javascript
复制
public abstract class BLLBase<T>
{
    protected GenericDAL<T> dal;

    public BLLBase()
    {
        dal = new GenericDAL<T>();
    }

    public virtual void Add(T model)
    {
        dal.Add(model);
    }

    public virtual T Get(int id)
    {
        return dal.Get(id);
    }

    public virtual List<T> GetAll()
    {
        return dal.GetAll();
    }

    public virtual void Delete(int id)
    {
        dal.Delete(id);
    }

    public virtual void Update()
    {
        dal.Update();
    }
}

..。它使用GenericDAL完成它的工作。因此,以模拟的方式,我刚刚编写了一个GenericBLL类,如下所示:

代码语言:javascript
复制
public class GenericBLL<T> : BLLBase<T>
{
    public GenericBLL() : base() { }
}

为了测试它,一个简单的控制台应用程序:

代码语言:javascript
复制
class Program
{
    static void Main(string[] args)
    {
        GenericBLL<ADMIN> bll = new GenericBLL<ADMIN>();
        List<ADMIN> admins = bll.GetAll();
    }
}

..。其中"ADMIN“是模型类型。就像一种魅力。

这样做的目的是避免为每个模型编写DAL / BLL类,除非它需要额外的功能。有人能告诉我为什么我不想这样做吗?我认为通用DAL / BLL类可以完成任务,还可以节省开发时间。

谢谢您抽时间见我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-21 15:29:04

嗯,一个缺点是,如果以后决定添加一些业务规则,则必须将类型从GenericBLLWhatever切换到WhateverBLL

一个显而易见的解决方案是创建一个继承自GenericBLLWhatever.的类。比如:

代码语言:javascript
复制
public class WhateverBLL : GenericBLL<Whatever>

用这个类代替。

票数 1
EN

Stack Overflow用户

发布于 2013-02-21 15:44:19

现在,你的BLL并没有特别的增值。每个调用都只是对另一个层的传递。也许这是应用程序的简单性(感谢您的幸运星,您是如此幸运),或者您可能有我所认为的生活在其他地方的实际业务逻辑。

对我来说,业务逻辑是指到持久化数据为止所做的一切,检索数据之后所做的一切,以及诸如此类的事情。决定,道路上的分叉,所采取的行动。实际上,通过比较,保存和检索数据是典型的非常琐碎的事情。

因此,当我查看您的通用DAL基类时,我认为这是一个很好的开始。我可能会从中提取一个接口,这样我就可以在测试时替换它。现在,继承基的类没有添加任何值。不要仅仅为了它而创建层和类,要确保它在某种程度上增加了价值并使您的生活变得更容易。

当我查看您的通用BLL类时,我认为您可能将真实的业务逻辑隐藏在某种形式的代码背后,或者隐藏在控制台应用程序中的类文件中。虽然确实有可能出现只在类型上不同的通用可应用功能,但我不认为有一个类是您想要的。我在这里的建议是重新考虑你认为什么是你的实际业务逻辑。一个简单的通过层的DAL可能不是吗。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15004334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档