好的,我来告诉你一些使用方法上的陷阱,以及我通常的做法。
陷阱
你的DAL实例属性似乎是一种聪明而奇怪的单例模式。你应该记住,对于你的Web服务器的请求可以被异步处理,所以如果你的Activator.CreateInstance调用需要一些时间,这可能会导致一些问题。
我猜你的BLL层也有同样的问题。最好在应用程序启动事件(无法记住确切名称)上执行此类初始化。
你基本上使用的是DI原则和存储库模式。两者都很棒,可以允许修改和测试,但是,由于你的抽象类将位于DAL中,而你的BLL方法将调用DAL类,因此你的BLL需要知道DAL。这可能会成为一个问题。你可以创建一个中间库,其中包含对抽象类的接口。
我通常的做法
我真的不喜欢应用程序中的“层”,因为往往很难区分不同类型的功能以及它们应该了解其他层的方向。我使用另一种方法,我不确定它是否被称为任何东西,但我称之为依赖环 :) 基本上,它就像一个飞镖板,其中最内部的程序集将不知道最外部的程序集。
在您典型的博客引擎 Web 应用程序中,我会做这样的事情:
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,然后发送任何您需要的电子邮件。
重点是:您有一个核心,它应该永远不会随着您的域而改变。然后您有仅知道核心的基础结构组件。您的Web应用程序知道核心和IOC框架-并且您拥有了解所有内容的IOC,并被允许这样做:)如果您需要进行更改,则很可能是在基础结构组件中,因此您只需更新IOC设置并实现哪些
我希望这讲得通,如果不能,请留下评论,我会尽力解释 :)
祝你好运
HttpApplication
类(Global
)。 - Jeff Sternalvar userBusinessLayer = Container.Resolve<IUserBusinessLayer>
()。 - Jeff Sternal