1 つのソリューションでプロジェクト間の相互依存関係を解決しようとして苦労しています。解決策は、いくつかのプロジェクトを持つ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」のようなユーザー データにアクセスできます。
モデル プロジェクトは、2 つの異なる名前空間の構造体 (モデル クラス) と DB エンジン クラスで構成されます。
上記のように、SW クラスはモデルに依存して User を宣言します。ここまでは大丈夫です。
しかし、実際には、クラスが最初に作成されたときに、デフォルト値を取得できるようにモデル オブジェクトに User、Company などのデータが必要です。F.Ex: 新しい請求書を作成する場合、ユーザー (顧客) に割り当てられた倉庫または支払タイプを取得すると便利です。
また、作業要件に従って、DB エンジンは、DB (会社ごとに 1 つ) を取得したり、ユーザー情報を含むログ エントリを保存したりするために、会社またはユーザーのデータを必要とします。
オブジェクトが 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のソリューションを取得しています。それらはプレーンなデータテーブルです。
はい、会社のデータをセッション (複数のユーザー、複数の会社がログオン) で提供するために SW で使用される Company という名前の別のモデル クラスがあります。ユーザーの構築時に、デフォルト値を SW から取得できることがわかります。たとえば、請求書の頭のような他のモデルについても同じです。それが私が望む振る舞いです。デフォルト値を取得するすべてのモデルは、New() のパラメーターとして完全なオブジェクトを取得します。一部のモデルでは、+25 flds オブジェクトから 1 つのフィールドのみが必要です。また、データのロード/クエリ/保存/削除に 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
大まかな例です。
したがって、SLN.Core.SW には SLN.Models.tblUsersRow と SLN.DBEngine.Generic が必要です。
また、SLN.Models.tblUsers には SLN.DBEngine が必要ですが、SLN.Core.SW も取得したいと考えています ...
SLN.DBEngine... は SLN.Core.SW が必要なので、指し示す DB を知っています (その他のこと)
SLN.Web にはそれらすべてが必要です。(はぁ!)
クリア?(えっと…)