ASP.NET MVCアプリケーションには、すべてのビジネスロジック/サービスレイヤーを含むプロジェクトがあります。このプロジェクトは、別のプロジェクトにある私のデータベース(エンティティフレームワーク)と相互作用します。
サービスレイヤーに簡単にアクセスできるようにしたかったので、簡単に参照できるように静的クラスを作成しました。たとえば、コントローラーを使用していて、新しいアカウントを作成する必要がある場合:
ServiceLayer.Accounts.CreateAccount(userName, passWord) //etc..
次に、サービスレイヤーは必要なすべてのロジックを実行し、のリポジトリを介してユーザーを作成しますDatabaseLayer
。
private static AllRepos _Repos;
private static AllRepos Repos {
get
{
if(_Repos == null)
_Repos = new AllRepos();
return _Repos
}
}
public static void CreateAccount(string username, password)
{
string salt = GenerateSalt();
Account newAccount = DatabaseLayer.Models.Account
{
Name = username,
Password = HashPassword(password, salt),
Salt = salt
};
Repos.AddAccount(newAccount);
}
サービスレイヤーのどこでも次のことをしたくなかったからです。
AccountRepository Accounts = new DatabaseLayer.AccountRepository();
代わりに、リポジトリのラッパークラスを作成したので、他のすべてのリポジトリを使用するには、一度だけインスタンス化する必要があります。
public class AllRepos
{
private AccountRepository _Accounts;
public AccountRepository Accounts
{
get
{
if (_Accounts== null)
_Accounts= new AccountRepository();
return _Accounts;
}
}
// the same is done for every other repository (currently have about 10+)
}
これは、サービス層の静的クラスで使用されました。
すべてのサービスレイヤークラスが静的であり、Repos
フィールドも静的であるため、私が遭遇し続ける明らかな問題は、同じオブジェクトが複数のデータコンテキストから取得され、更新/削除の奇妙な動作を引き起こすことです。
ServiceLayer.Accounts.Method()
アプリケーションのライフサイクルが続くので、静的メンバー/クラスを使用する場合はこれが予想されることを理解していますが、非静的クラスを作成せずにサービスレイヤーを使用できる方法はありますか?使用するすべての場所でインスタンス化する必要があり、複数のデータコンテキストインスタンスが原因でCRUDの問題が発生しないようにする必要がありますか?