静的メソッドについて読んだ多くの場所で、データベースへのアクセスには静的メソッドを使用せず、他のサービスを挿入するために依存性注入を使用し、そのサービスを使用して他のロジックを作成する必要がありますが、BServiceにAServiceを挿入すると問題が発生しますCServiceにAServiceを挿入するビジネスロジックが数か月を超えると、BServiceをCServiceに挿入する必要が生じます。問題が発生すると、AServiceはすでに2か所に挿入できません。私はその解決策を修正するためにこのようなものを試します。
public class InterlocutorFacade : GenericEFRepository<MsSql1DbContext, GenericUser>, IInterlocutorFacade
{
public InterlocutorFacade(MsSql1DbContext _msGenericDb) : base(_msGenericDb)
{
}
public async Task AddC()
{
await UserService.CreateLogs(_msGenericDb.Set<Logs>());
await _msGenericDb.SaveChangesAsync();
}
public async Task GetC()
{
var result = await UserService.GetFirstLogs(_msGenericDb.Set<Logs>());
}
}
これは私が使っているサービスです
public static class UserService
{
internal static async Task<Logs> GetFirstLogs(DbSet<Logs> dbSet)
{
var result = await dbSet.FirstOrDefaultAsync();
return result;
}
internal static async Task CreateLogs(DbSet<Logs> dbSet)
{
var result = await dbSet.AddAsync(new Logs() { });
}
}
しかし、それを実行するとどのような問題が発生するかわかりません。誰かが私に問題(パフォーマンス、データの競合など)を示してもらえれば、これを使用すると問題が発生しますか?
依存関係のオーバースタティック注入を使用する場合の問題は、実装を切り替えることができないことです。これは主に単体テストで行われます
例えば
public class Service
{
public Service() {}
public AddData(Data data)
{
MyStaticDBClass.Add(data);
}
}
アプリケーションではこれは正常に機能しますが、単体テストでは実際にデータベースに書き込みます。あなたはそれをしたくない。
に比べ:
public class Service
{
private readonly IDataLayer dl;
public Service(IDataLayer dl) { this.dl = dl;}
public AddData(Data data)
{
dl.Add(data);
}
}
これで、アプリケーションでは実際のデータレイヤーオブジェクトを渡し、テストではモックバージョンを渡すことができます。
あなたは2番目の問題です。循環依存関係は基本的に、dll Bに依存しているためdll Aをコンパイルできないことと、Aに依存しているためdll Bをコンパイルできないことを示しています。
これを解決するには、インターフェースを実装から分離する必要があります。それらを別のプロジェクトに配置します。
IAService //no references
IAService.cs //interface for AService
IBService //no references
IBService.cs //interface for BService
AService // references IAService and IBService
Aservice.cs //implementation of IAService
BService // references IAService and IBService
BService.cs //implementation of IBService
IBService参照は実際の実装プロジェクトにのみ存在するため、最初にIAServiceプロジェクトをコンパイルできます。