web-dev-qa-db-ja.com

c#データベースへのアクセスに静的クラスを使用するとどのような問題が発生しますか?

静的メソッドについて読んだ多くの場所で、データベースへのアクセスには静的メソッドを使用せず、他のサービスを挿入するために依存性注入を使用し、そのサービスを使用して他のロジックを作成する必要がありますが、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() { });
    }

}

しかし、それを実行するとどのような問題が発生するかわかりません。誰かが私に問題(パフォーマンス、データの競合など)を示してもらえれば、これを使用すると問題が発生しますか?

1
uopeydel

依存関係のオーバースタティック注入を使用する場合の問題は、実装を切り替えることができないことです。これは主に単体テストで行われます

例えば

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プロジェクトをコンパイルできます。

3
Ewan