嗯,我会告诉你关于你的方法的一些缺陷,以及我通常如何做。
陷阱
您DAL实例属性似乎是在做一个单身的智能,奇怪的方式。你应该记住,对你的web服务器的请求可以异步处理,所以如果你的Activator.CreateInstance调用需要一些时间,这可能会导致一些问题。
我猜,你的BLL层有同样的问题。最好对应用程序启动事件进行这种初始化(不记得确切的名称)。
你基本上在这里使用的是DI原则和存储库模式。两者都很好,并且可以进行修改和测试,但是,由于您的抽象类将在DAL中,并且您的BLL方法将调用DAL类,因此BLL需要了解DAL。这可能是一个问题。您可以创建一个中间库,并为您的抽象类提供一个接口。
我通常做
我真的不喜欢在一个应用程序“层”,因为它往往很难不同类型的功能进行区分,并且在哪个方向,他们应该知道其他层。我使用了另一种方法,我不太确定是否配了任何东西,但我把它称为依赖圆:)基本上,它就像一个飞镖板,最内层的组件对最外层的组件不知道。
在您典型的博客引擎web应用程序,我会做这样的事情:
BlogEngine.Core
持有各种项目(Post
,User
,Comment
,等等)以及各种接口服务的POCO实体。这些服务可以包括IEmailService
,IBlogRepository
,IUserManagement
等等......我现在做一个BlogEngine.Infrastructure.Persistence
程序集,它知道.Core
并实现了IBlogRepository
。我对所有其他服务也一样。
现在 - 您的BlogEngine.Web
只需引用您的.Core
程序集和IoC框架程序集,该程序集将处理所有依赖关系。如果我想更新帖子,我可以做myIOC.GetInstance<IBlogRepository>().SaveOrUpdatePost(newPost);
。
比方说,当人们在他们的博客上发表评论时,你想通知作者。您可以在.Core
中以Notifier
-类的形式实现此逻辑。这个类可以解析IEmailService,然后发送你需要的任何邮件。
要点:你有一个核心,它永远不会改变你的域名。然后你得到只知道Core的基础设施组件。你有你的知道关于Core和IOC框架的Web应用程序 - 并且你得到了你的IOC,它知道所有事情,并且被允许这样做:)如果你需要进行修改,很可能是它在基础结构程序集中,所以你只需要更新您的IOC的设置和实施其
我希望这是有道理的,如果没有,请发表评论和生病尝试进一步解释:)
好运
你是什么意思顶级应用程序? – luppi
我可能应该说'申请'。在.NET中,这是您的可执行文件或'HttpApplication'类('Global')。 –
如果我为每个模块定义DAL和BLL层,该怎么办? 可以说我有3个模块:用户,评论,BlogPosts他们每个人都会有它自己的DAL和BLL类(当然每个人都可以使用不同的数据库提供者),这将需要我在global.aspx中定义许多属性。它有效吗? – luppi