gpt4 book ai didi

vb.net - N-Tier Architecture - 在 VB.NET 中具有多个项目的结构

转载 作者:行者123 更新时间:2023-12-04 12:01:25 26 4
gpt4 key购买 nike

我想要一些关于在以下情况下使用的最佳方法的建议......

我将有一个 Windows 应用程序和一个 Web 应用程序(表示层),它们都将访问一个公共(public)业务层。业务层将查看配置文件以查找将在运行时创建引用的 dll(数据层)的名称(这是最好的方法吗?)。

在运行时创建对数据访问层的引用的原因是,应用程序将根据客户端使用的内容与不同的第 3 方会计系统进行交互。所以我会有一个单独的数据访问层来支持每个会计系统。这些可以是单独的设置项目,每个客户都会使用其中一个,他们不需要在两者之间切换。

项目:

MyCompany.Common.dll - 包含接口(interface),所有其他项目都有对这个的引用。
MyCompany.Windows.dll - Windows 窗体项目,引用 MyCompany.Business.dll
MyCompany.Web.dll - 网站项目,引用 MyCompany.Business.dll
MyCompany.Busniess.dll - 业务层,引用 MyCompany.Data.*(在运行时)
MyCompany.Data.AccountingSys1.dll - 会计系统 1 的数据层
MyCompany.Data.AccountingSys2.dll - 会计系统 2 的数据层

项目我的公司.Common.dll 将包含所有接口(interface),每个其他项目都会引用这个。

Public Interface ICompany
ReadOnly Property Id() as Integer
Property Name() as String
Sub Save()
End Interface

Public Interface ICompanyFactory
Function CreateCompany() as ICompany
End Interface

项目 MyCompany.Data.AccountingSys1.dll MyCompany.Data.AccountingSys2.dll 将包含如下类:
Public Class Company
Implements ICompany

Protected _id As Integer
Protected _name As String

Public ReadOnly Property Id As Integer Implements MyCompany.Common.ICompany.Id
Get
Return _id
End Get
End Property

Public Property Name As String Implements MyCompany.Common.ICompany.Name
Get
Return _name
End Get
Set(ByVal value as String)
_name = value
End Set
End Property

Public Sub Save() Implements MyCompany.Common.ICompany.Save
Throw New NotImplementedException()
End Sub

End Class

Public Class CompanyFactory
Implements ICompanyFactory

Public Function CreateCompany() As ICompany Implements MyCompany.Common.ICompanyFactory.CreateCompany
Return New Company()
End Function

End Class

项目 我的公司.Business.dll 将提供业务规则并从数据层检索数据:
Public Class Companies

Public Shared Function CreateCompany() As ICompany
Dim factory as New MyCompany.Data.CompanyFactory
Return factory.CreateCompany()
End Function

End Class

任何意见/建议将不胜感激。

最佳答案

几点评论。

我会避免使用 MyCompany.Common.dll部件。这些通常最终会充满各种不相关的东西,然后经常需要重新构建所有程序集。

我会用应用程序名称和公司名称来命名您的程序集。 MyCompany.MyApplication.Business.dll优于 MyCompany.Business.dll .然后更容易将应用程序拆分为子部分并重用来自多个应用程序的代码。

最好为您将拥有的每种类型的实现程序集提供单独的契约(Contract)程序集。在您的情况下,我会建议以下内容:

MyCompany.MyApplication.Windows-Contract.dll
MyCompany.MyApplication.Windows.dll

MyCompany.MyApplication.Web-Contract.dll
MyCompany.MyApplication.Web.dll

MyCompany.MyApplication.Business-Contract.dll
MyCompany.MyApplication.Business.dll

MyCompany.MyApplication.Data-Contract.dll
MyCompany.MyApplication.Data.AccountingSys1.dll
MyCompany.MyApplication.Data.AccountingSys2.dll

从您的描述看来, AccountingSys1AccountingSys2程序集共享一个公共(public)合约,因此两个实现程序集只有一个合约程序集。

契约(Contract)程序集应该代表您的设计,而不是您的实现,并且只会因设计更改而更改。您应该避免使用任何“重要”代码(以避免错误),并且应该将代码限制为接口(interface)、枚举、异常、属性、事件参数和结构——所有这些都没有“重要”代码。

在设置程序集引用时,您应该确保程序集只引用契约(Contract)程序集,如下所示:
Data.AccountingSys1
Data-Contract

Data.AccountingSys2
Data-Contract

Business
Business-Contract
Data-Contract

Windows
Windows-Contract
Business-Contract
Data-Contract (maybe)

Web
Web-Contract
Business-Contract
Data-Contract (maybe)

因此,实现程序集永远不会依赖于其他实现程序集。当实现发生变化时,您只有一个要重建的程序集。

此规则的异常(exception)是在创建继承层次结构时。例如,您可以创建 *.Data.AccountingSys.dll为两个特定的会计系统程序集定义基类。

如果您可以遵循以上所有内容,那么您将需要实现某种依赖注入(inject)方法,以便能够从契约(Contract)程序集中的接口(interface)创建对象实例。您可以使用现有的 DI 框架或创建第三组 *-Factory.dll包含您的工厂方法的程序集。

这种结构的另一个好处是单元测试更简单,并且可以基于契约而不是实现,帮助您编写干净、可测试的代码。

这可能看起来像很多程序集,但您从防止代码创建讨厌的依赖项中获得的好处将大大减少您的项目变得过于复杂的机会,并有助于在您进行时提高质量。现在一点点痛,以后就会消除那么多痛。

关于vb.net - N-Tier Architecture - 在 VB.NET 中具有多个项目的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2466293/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com