我正在开发一些小型ASP.NET应用程序,并想知道什么模式。你在项目中使用的方法。
我的项目涉及数据库,使用数据访问和业务逻辑层。
我到目前为止使用的数据访问方法如下(我在一本书中读到并喜欢它):
对于DAL图层:
创建一个抽象类,定义要实现的所有数据库操作方法。
抽象类将包含一个静态“Instance”属性,它将加载(如果instance == null)所需类型的实例(Activator.CreateInstance)(实现它的类)。
创建一个实现此抽象类的类,实现将根据使用的数据库(SQL,mySQL等)。 有了这个,我可以根据使用的数据库创建不同的实现。
对于BLL图层:
一个封装所有检索到的字段的类,以及将调用DAL类的静态方法。
这是一个好方法吗? 在这些情况下你更喜欢用什么?
答案 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实体(Post
,User
,Comment
,等等)以及各种服务接口。这些服务可以包括IEmailService
,IBlogRepository
,IUserManagement
等等。我现在制作一个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。