我很难在一个解决方案中解决项目之间的交叉依赖关系。解决方案是一个包含多个项目的 asp.net 应用程序。
Web 项目使用 SLN.Core 项目中的 sessionwrapper 类的服务。声明如下:
public sealed class SW
{
public static tblUserRow User
{
get
{
if (HttpContext.Current == null) return null;
return HttpContext.Current.Session["dtUser"] == null ? null : (tblUsersRow)(HttpContext.Current.Session["dtUser"] as tblUsers).Rows[0];
}
}
public static void User_Load(string userId)
{
tblUsers users = new tblUsers();
users.LoadByID(userId);
if (users.Count != 0)
{
HttpContext.Current.Session["dtUser"] = users;
}
}
}
tblUserRow 是单独模型项目中用户类(强类型数据表)的模型定义的一部分。SW 类中还有一些其他方法,但不相关。所以在 SLN.Web 我可以访问像“SW.User.Name”这样的用户数据
模型项目由两个不同命名空间中的结构(模型类)和数据库引擎类组成。
如上所示,SW 类依赖于模型来声明 User。到这里一切正常。
但事实是模型对象在第一次创建类时需要用户、公司等数据,以便它们可以获得默认值。F.Ex:如果您创建新发票,最好让用户(客户)分配仓库或付款类型。
根据工作要求,数据库引擎需要公司或用户数据来制作诸如获取数据库(每个公司一个)或保存带有用户信息的日志条目之类的事情。
直到对象在每次调用 DB 引擎类甚至方法时都被传递的那一天,但现在我正在重构它,我认为如果可以直接从 SW 的相应位置获取该信息,它会更清洁且内存消耗更少。
但它们之间存在交叉依赖。由于 SW 成员被声明为静态的,因此它们可以独立于会话而持续存在,我无法创建接口。
有什么建议么?
更新:之前解决的用户数据范围存在问题,所以我在这里更正了。此外,我将添加更多代码以便更好地理解。从这里 VB,对不起伙计们,但这是一个很好的多样性模型。
SLN.Models 中的 tblUser 模型示例:
<DesignerCategory("Code"), System.SerializableAttribute()>
Partial Public Class tblUsers
Inherits TypedTableBase(Of tblUsersRow)
<DebuggerNonUserCodeAttribute()>
Public Sub New()
MyBase.New()
BeginInit()
InitClass()
EndInit()
End Sub
<DebuggerNonUserCodeAttribute()>
Private Sub InitClass()
TableName = TABLE_NAME
With Columns
.Add(New DataColumn(FIELD_ID, GetType(String)))
.Add(New DataColumn(FIELD_Name, GetType(String)))
...
'Added that last columns as example
.Add(New DataColumn(FIELD_Company, GetType(String)) With {.DefaultValue=SW.Company.ID})
.Add(New DataColumn(FIELD_Warehouse, GetType(String)) With {.DefaultValue=SW.Company.Warehouse})
End With
Dim keys(1) As DataColumn
keys(0) = Columns(0)
PrimaryKey = keys
End Sub
...
<DebuggerNonUserCodeAttribute()>
Public Sub LoadByID(Id As String)
Rows.Clear()
Merge(New SLN.DBEngine.Generic(SW.Company.Connection, doLog:=False).ExecuteQuery(COMMAND_LOADBY_ID, Id))
End Sub
...
End Class
Partial Public Class tblUsersRow
Inherits DataRow
<DebuggerNonUserCodeAttribute()>
Friend Sub New(ByVal builder As DataRowBuilder)
MyBase.New(builder)
End Sub
<DebuggerNonUserCodeAttribute()>
Public Property ID() As String
Get
Return DirectCast(MyBase.Item(0), String)
End Get
Set(value As String)
MyBase.Item(0) = value
End Set
End Property
<DebuggerNonUserCodeAttribute()>
Public Property Name() As String
Get
Return DirectCast(MyBase.Item(1), String)
End Get
Set(value As String)
MyBase.Item(1) = value
End Set
End Property
...
End Class
**模型类是这样的,而我在 EF 上获得了多个 DB 的解决方案。它们是普通的数据表。
是的,还有另一个名为 Company 的模型类也用于 SW 中,用于在会话中提供公司的数据(多个用户,多个公司登录)您可以看到在用户构建时,可以从 SW 中检索默认值。例如,发票头等其他模型也是如此。这就是我想要的行为。到目前为止,所有获得默认值的模型,它们都会获得一个完整的对象作为 New() 的参数。一些模型只需要 +25 flds 对象中的一个字段。他们还使用 DBEngine 来加载/查询/保存/删除数据。
在 SLN.Web 中可能会看到类似这样的内容(登录):
SW.Company_Load(ddlCompany.Text)
sDescription = New Generic(SW.Company.Connection,False).ExecuteQuery("sp_Warehouse_LoadBy_Id",SW.User.Warehouse).Rows(0)("rDescription").ToString
Thaaats 是一个粗略的例子。
所以 SLN.Core.SW 需要 SLN.Models.tblUsersRow 和 SLN.DBEngine.Generic
而 SLN.Models.tblUsers 需要 SLN.DBEngine 但也想获得 SLN.Core.SW ...
SLN.DBEngine... 需要 SLN.Core.SW 所以他知道要指向的数据库(其他一些东西)
而 SLN.Web 需要所有这些。(叹!)
清除?(呃……)