2017-04-08 10 views
0

Generic ServiceからGenericRepにDbContextを破棄しようとしています。.NETコアでオーバーライドするDisposeメソッドがないのはなぜですか?

私の一般的なレポは、ここで説明したパターン実装されています。私は私のレポでの最初の部分を設定している https://docs.microsoft.com/en-us/aspnet/mvc/overview/older-versions/getting-started-with-ef-5-using-mvc-4/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application

を:

彼らはStudentControllerでこれを持って記事の今
public class GenericRepository<T> : IGenericRepository<T>, IDisposable 
    where T: BaseEntity 
{ 
    protected readonly ApplicationDbContext _context; 
    protected DbSet<T> _dbSet; 
    . 
    . 
    . 
    private bool disposed = false; 

    protected virtual void Dispose(bool disposing) 
    { 
     if (!this.disposed) 
     { 
      if (disposing) 
      { 
       _context.Dispose(); 
      } 
     } 
     this.disposed = true; 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

protected override void Dispose(bool disposing) 
    { 
    studentRepository.Dispose(); 
    base.Dispose(disposing); 
    } 

IDisposableなどを実装しているStudentControllerはありません。 彼らは、DisposeをObjectの標準オーバーライド可能なメソッドとしてオーバーライドすることができるようです。

これを私のGeneric Serviceに入れる必要があります。ここで

は私の汎用サービスです:

public class GenericService<T> : IGenericService<T> 
    where T : BaseEntity 
{ 
    private IGenericRepository<T> _genericRepo; 

    public GenericService(IGenericRepository<T> genericRepo) 
    { 
     _genericRepo = genericRepo; 
    } 
    . 
    . 
    . 
    public override void Dispose(bool disposing) 
    { 
     _genericRepo.Dispose(); 
     base.Dispose(disposing); 
    } 

だから私は私のコードの上に2つの赤いsquiggliesを持っています。

1)GenericServiceを上書きする適切なメソッドが見つかりません。

これはフルフレームワークで標準オーバーライド可能なオブジェクトですが、.Netコアではありませんか?

2)オブジェクトには、base.Dispose呼び出しでDisposeの定義が含まれていません。

これはどういうわけか.Net Coreで行われていますか?

UPDATE 1:

おかげNkosi(回答1)以下のあなたの答えのために。

は、だから今、私はserviceRepoはこのように私のコントローラからdisposeの呼び出しています:

[Route("api/[controller]")] 
public class CasesController : Controller, IDisposable 
{ 
    private readonly IGenericService<Case> _caseGenericService; 

    public CasesController(IGenericService<Case> caseGenericService) 
    { 
     _caseGenericService = caseGenericService; 
    } 
    . 
    . 
    . 
    private bool disposed = false; 

    protected virtual void Dispose(bool disposing) 
    { 
     if (!this.disposed) 
     { 
      if (disposing) 
      { 
       _caseGenericService.Dispose(); 
       base.Dispose(); 
      } 
     } 
     this.disposed = true; 
    } 

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 

それは一種の少数の処分のために、動作します。 しかし、それはぶら下がりを開始するようです。

+1

はSystem.Object' 'には'のDispose() 'はありません。彼らはそのメソッドを持っている 'Controller'から継承しています。 – CodeCaster

+0

'Controller'はすでに' IDisposable'から継承しています。 'Dispose()'メソッドを削除し、 'Dispose(bool disposing)'を 'override'に更新してください。 – Nkosi

+0

githubの[Controller](https://github.com/aspnet/Mvc/blob/44048331e936de39073ca5eab97bd5b5cdb0a0f2/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Controller.cs#L361)のソースコードを見てください。コントローラーの廃棄方法をいくつか変更する必要があります。 – Nkosi

答えて

2

ジェネリックサービスはジェネリックリポジトリと同様に使い捨てを定義/実装する必要があります。現在のクラスがそれを定義しているので、オーバーライドするか、または基にする必要はありません。

public class GenericService<T> : IGenericService<T>, IDisposable 
    where T : BaseEntity 
{ 
    private IGenericRepository<T> _genericRepo; 

    public GenericService(IGenericRepository<T> genericRepo) 
    { 
     _genericRepo = genericRepo; 
    } 
    . 
    . 
    . 
    private bool disposed = false; 
    // Protected implementation of Dispose pattern. 
    protected virtual void Dispose(bool disposing) 
    { 
     if (disposed) 
      return; 

     if (disposing) { 
      _genericRepo.Dispose(); 
      // Free any other managed objects here. 
      // 
     } 

     // Free any unmanaged objects here. 
     // 
     disposed = true; 
    }  

    public void Dispose() 
    { 
     Dispose(true); 
     GC.SuppressFinalize(this); 
    } 
} 

リファレンスImplementing a Dispose Method

関連する問題