このトピックの「ビジネス ロジック」という用語は、データがデータベースに挿入、更新、またはデータベースから削除される前にデータに適用するカスタム ルールまたは検証テストを指します。 ビジネス ロジックは、"ビジネス ルール" または "ドメイン ロジック" とも呼ばれます。n 層アプリケーションでは、通常、プレゼンテーション層またはデータ アクセス層とは別に変更できるように、論理層として設計されています。 ビジネス ロジックは、データベース内のデータの更新、挿入、または削除の前後に、データ アクセス 層によって呼び出すことができます。
ビジネス ロジックは、フィールドの型がテーブル列の型と互換性があることを確認するスキーマ検証と同じくらい簡単です。 または、任意の複雑な方法で対話するオブジェクトのセットで構成できます。 規則は、データベースのストアド プロシージャとして、またはメモリ内オブジェクトとして実装できます。 ただし、ビジネス ロジックは実装されていますが、LINQ to SQL を使用すると、部分クラスと部分メソッドを使用して、ビジネス ロジックをデータ アクセス コードから分離できます。
LINQ to SQL がビジネス ロジックを呼び出す方法
デザイン時に、手動で、またはオブジェクト リレーショナル デザイナーまたは SQLMetal を使用してエンティティ クラスを生成すると、部分クラスとして定義されます。 つまり、別のコード ファイルで、カスタム ビジネス ロジックを含むエンティティ クラスの別の部分を定義できます。 コンパイル時に、2 つの部分が 1 つのクラスにマージされます。 ただし、オブジェクト リレーショナル デザイナーまたは SQLMetal を使用してエンティティ クラスを再生成する必要がある場合は、これを行うことができます。また、クラスの一部は変更されません。
エンティティと DataContext を定義する部分クラスには、部分メソッドが含まれています。 これらは、エンティティまたはエンティティ プロパティの更新、挿入、または削除の前後にビジネス ロジックを適用するために使用できる拡張ポイントです。 部分メソッドはコンパイル時イベントと考えることができます。 コード ジェネレーターはメソッド シグネチャを定義し、get および set プロパティ アクセサー、 DataContext
コンストラクター、場合によってはバックグラウンドで SubmitChanges が呼び出されたときにメソッドを呼び出します。 ただし、特定の部分メソッドを実装しない場合は、コンパイル時に、それに対するすべての参照と定義が削除されます。
個別のコード ファイルに記述する実装定義では、必要なカスタム ロジックを実行できます。 部分クラス自体をドメイン レイヤーとして使用することも、部分メソッドの実装定義から別のオブジェクトに呼び出すこともできます。 いずれの場合も、ビジネス ロジックは、データ アクセス コードとプレゼンテーション レイヤー コードの両方から完全に分離されます。
拡張ポイントを詳しく見る
次の例は、DataContext
とCustomers
の 2 つのテーブルを持つOrders
クラスのオブジェクト リレーショナル デザイナーによって生成されるコードの一部を示しています。 Insert、Update、Delete の各メソッドは、クラス内の各テーブルに対して定義されていることに注意してください。
Partial Public Class Northwnd
Inherits System.Data.Linq.DataContext
Private Shared mappingSource As _
System.Data.Linq.Mapping.MappingSource = New _
AttributeMappingSource
#Region "Extensibility Method Definitions"
Partial Private Sub OnCreated()
End Sub
Partial Private Sub InsertCustomer(instance As Customer)
End Sub
Partial Private Sub UpdateCustomer(instance As Customer)
End Sub
Partial Private Sub DeleteCustomer(instance As Customer)
End Sub
Partial Private Sub InsertOrder(instance As [Order])
End Sub
Partial Private Sub UpdateOrder(instance As [Order])
End Sub
Partial Private Sub DeleteOrder(instance As [Order])
End Sub
#End Region
public partial class MyNorthWindDataContext : System.Data.Linq.DataContext
{
private static System.Data.Linq.Mapping.MappingSource mappingSource = new AttributeMappingSource();
#region Extensibility Method Definitions
partial void OnCreated();
partial void InsertCustomer(Customer instance);
partial void UpdateCustomer(Customer instance);
partial void DeleteCustomer(Customer instance);
partial void InsertOrder(Order instance);
partial void UpdateOrder(Order instance);
partial void DeleteOrder(Order instance);
#endregion
部分クラスに Insert メソッド、Update メソッド、Delete メソッドを実装すると、LINQ to SQL ランタイムは、 SubmitChanges が呼び出されたときに、独自の既定のメソッドではなく、それらを呼び出します。 これにより、作成/読み取り/更新/削除操作の既定の動作をオーバーライドできます。 詳細については、「 チュートリアル: エンティティ クラスの挿入、更新、および削除動作のカスタマイズ」を参照してください。
OnCreated
メソッドは、クラス コンストラクターで呼び出されます。
Public Sub New(ByVal connection As String)
MyBase.New(connection, mappingSource)
OnCreated()
End Sub
public MyNorthWindDataContext(string connection) :
base(connection, mappingSource)
{
OnCreated();
}
エンティティ クラスには、エンティティの作成、読み込み、および検証時 ( SubmitChanges
が呼び出されたときに) LINQ to SQL ランタイムによって呼び出される 3 つのメソッドがあります。 また、エンティティ クラスには、プロパティごとに 2 つの部分メソッドがあり、1 つはプロパティが設定される前に呼び出され、1 つは後で呼び出されます。 次のコード例は、 Customer
クラスに対して生成されるメソッドの一部を示しています。
#Region "Extensibility Method Definitions"
Partial Private Sub OnLoaded()
End Sub
Partial Private Sub OnValidate(action As _
System.Data.Linq.ChangeAction)
End Sub
Partial Private Sub OnCreated()
End Sub
Partial Private Sub OnCustomerIDChanging(value As String)
End Sub
Partial Private Sub OnCustomerIDChanged()
End Sub
Partial Private Sub OnCompanyNameChanging(value As String)
End Sub
Partial Private Sub OnCompanyNameChanged()
End Sub
' ...Additional Changing/Changed methods for each property.
#region Extensibility Method Definitions
partial void OnLoaded();
partial void OnValidate();
partial void OnCreated();
partial void OnCustomerIDChanging(string value);
partial void OnCustomerIDChanged();
partial void OnCompanyNameChanging(string value);
partial void OnCompanyNameChanged();
// ...additional Changing/Changed methods for each property
メソッドは、 CustomerID
プロパティの次の例に示すように、プロパティ セット アクセサーで呼び出されます。
Public Property CustomerID() As String
Set
If (String.Equals(Me._CustomerID, value) = False) Then
Me.OnCustomerIDChanging(value)
Me.SendPropertyChanging()
Me._CustomerID = value
Me.SendPropertyChanged("CustomerID")
Me.OnCustomerIDChanged()
End If
End Set
End Property
public string CustomerID
{
set
{
if ((this._CustomerID != value))
{
this.OnCustomerIDChanging(value);
this.SendPropertyChanging();
this._CustomerID = value;
this.SendPropertyChanged("CustomerID");
this.OnCustomerIDChanged();
}
}
}
クラスの部分では、メソッドの実装定義を記述します。 Visual Studio で、 partial
入力すると、クラスの他の部分にあるメソッド定義の IntelliSense が表示されます。
Partial Public Class Customer
Private Sub OnCustomerIDChanging(value As String)
' Perform custom validation logic here.
End Sub
End Class
partial class Customer
{
partial void OnCustomerIDChanging(string value)
{
//Perform custom validation logic here.
}
}
部分メソッドを使用してビジネス ロジックをアプリケーションに追加する方法の詳細については、次のトピックを参照してください。
チュートリアル: エンティティ クラスの挿入、更新、削除の動作のカスタマイズ