Asp.net DAL和BLL首选设计模式方法

时间:2010-03-03 16:11:56

标签: asp.net design-patterns

我正在开发一些小型ASP.NET应用程序,并想知道什么模式。你在项目中使用的方法。

我的项目涉及数据库,使用数据访问和业务逻辑层。

我到目前为止使用的数据访问方法如下(我在一本书中读到并喜欢它):

对于DAL图层:
创建一个抽象类,定义要实现的所有数据库操作方法。 抽象类将包含一个静态“Instance”属性,它将加载(如果instance == null)所需类型的实例(Activator.CreateInstance)(实现它的类)。

创建一个实现此抽象类的类,实现将根据使用的数据库(SQL,mySQL等)。 有了这个,我可以根据使用的数据库创建不同的实现。

对于BLL图层:
一个封装所有检索到的字段的类,以及将调用DAL类的静态方法。

这是一个好方法吗? 在这些情况下你更喜欢用什么?

3 个答案:

答案 0 :(得分:2)

通过使用静态类方法,您将隐藏这些组件的依赖关系,并在将来限制您的选项(例如,您不能将业务层子类化)。

不要将单例和静态方法用于数据访问和业务层,而应考虑更改业务层类以要求数据访问实例,并在顶级应用程序中保留业务层的单个实例:

public class Global HttpApplication {

    // This would really be a property
    // It's also unfortunate this has to be static, but you're stuck with
    // default constructors for ASP.NET pages, so there's no alternative.
    public static BusinessLayerClass BusinessLayer;

    protected void Application_Start(object sender, EventArgs e) {
         AbstractDataAccessLayer dataAccess = new ConcreteDataAccessLayer();
         Global.BusinessLayer = new BusinessLayerClass(dataAccess);             
    }
}

页面然后使用它:

public void PerformSomeBusinessFunction() {
    Global.BusinessLayer.DoSomething();
}

这显然表明您的业务层需要数据访问,提供了一个方便的位置来指定它将使用哪种类型的数据访问对象,并为您在必要时使用不同的创建策略铺平了道路。例如,您可能提供数据访问工厂,而不是在所有业务层中共享单个实例。

这里的一般原则称为“dependency injection”(有时它被称为“控制反转”,这是DI背后更普遍的原则。)

如果此dependency injection by hand开始变得繁琐,请考虑使用a dependency injection framework(人们也称这些“IoC容器”)。

答案 1 :(得分:1)

好吧,我会告诉你一些关于你的方法的陷阱,以及我一般如何做。

<强>陷阱

你的DAL-instance属性看起来像是一个聪明,奇怪的做单身人士的方式。您应该记住,对Web服务器的请求可以异步处理,因此如果您的Activator.CreateInstance调用需要一些时间,这可能会导致一些问题。

我猜你的BLL层遇到了同样的问题。最好在应用程序启动事件上进行这种初始化(不记得确切的名称)。

这里你基本上使用的是DI原理和存储库模式。两者都很棒,并且允许进行修改和测试,但是,由于您的抽象类将在DAL中,并且您的BLL方法将调用DAL类,因此您的BLL需要了解DAL。这可能是个问题。您可以创建一个带有抽象类接口的中间库。

我通常做的事情

我真的不喜欢应用程序中的“图层”,因为通常很难区分不同类型的功能,以及他们应该知道其他图层的方向。我使用另一种方法,我不确定它被称为任何东西,但我把它称为依赖圈:)基本上,它就像一个飞镖板,最里面的组件对最外层的一无所知。

在典型的博客引擎网络应用中,我会做这样的事情:

BlogEngine.Core包含各种项目的POCO实体(PostUserComment,等等)以及各种服务接口。这些服务可以包括IEmailServiceIBlogRepositoryIUserManagement等等。我现在制作一个BlogEngine.Infrastructure.Persistence程序集,它知道.Core和工具IBlogRepository。我也为所有其他服务做同样的事 现在 - 您的BlogEngine.Web只需要引用您的.Core程序集和IoC框架程序集,它将处理您的所有依赖项。如果我想更新帖子,我可以myIOC.GetInstance<IBlogRepository>().SaveOrUpdatePost(newPost); 假设当人们在他们的博客上发表评论时,你想通知作者。您可以在.Core中将此逻辑实现为Notifier - 类。这个类可以解析IEmailService,然后发送你需要的任何电子邮件。

重点是:你有一个核心,永远不会改变你的域名。然后你得到了只知道Core的基础设施组件。你得到了你的网络应用程序,它知道Core和IOC框架 - 你得到了你的IOC知道所有事情,并且被允许这样做:)如果你需要做出改变,很可能是它在基础设施组件和所以你只需要更新你的IOC设置并实现哪个

我希望这是有道理的,如果没有,请发表评论,我试着进一步解释:)

祝你好运

答案 2 :(得分:1)

这是一个很好的方法。我也在使用这种方法。我使用企业库进行DAL。最近我发现使用L2S对DAL很有用。

我也建议使用NHibernate。