2016-05-20 5 views
0

新しいオブジェクトをインスタンス化するたびに作成しているオブジェクトコンテキストを適切に破棄する方法を見つけることができない問題が発生しています。 。リポジトリ(DAL)を実装する際のオブジェクトコンテキストの破棄とTDD用のMocking DAL

public class OrderBLL{ 

    var _iOrderLineDal; 

    public OrderBLL(){ 
     _iOderLineDal = new OrderLineDal(new entityOBject(dbconnectionstring); 
    } 

    public OrderBLL(iOrderLineDal mockOrderLineDal){ 
     _iOrderLineDal = mockOrderLineDal; 
    } 
} 

だから、問題は私のサービスはOrderBLLの新しいインスタンスを作成し、任意の新規受注は、データ・ベースであるかどうかを確認するための方法を実行し、30秒ごとこと、です。

30秒ごとに、処理されていない新しいentityObjectを作成します。コードの古い実装はusingステートメントを使って書かれました。

public bool HasNewOrders(){ 

    using(var entityObject = new entityObject(dbconnectionString)){ 
     var newOrders = entityObject.GetNewOrders(); 
    } 
    //some logic 
} 

このusingステートメントを使用しての問題は、私はentityObjectをモックと簡単にこのOrderBLLクラス内のいずれかの方法でユニットテストを書くことができないです。

私はOrderLineDal内にdisposeメソッドで処分しようとしましたが、一度disposeというデータが得られました。これは最初の反復はうまくいきましたが、次の30秒後の反復では、entityObjectが処分されて使用できないと言います。

私はこのリポジトリパターンを実装して、すべての新しいentityObjectを処分できる方法はありますか?私はDALを偽造することができます。ユニットテスト?

私はEF 4で作業していますが、コードファーストが設定されていないため、POCOがありません。

答えて

1

理想的には、OrderBLL(リポジトリパターン用にGoogleを検索)以外でコンテキストを作成することをお勧めします。

public class OrderRepository : IOrderRepository, IDisposable 
{ 
    private readonly IOrderDBContext _dbContext; 
    // poor mans dependency injection 
    public OrderRepository() : this(new OrderDbContext("YourConnectionString") 
    {} 

    public OrderRepository(IOrderDBContext dbContext) 
    { 
     if (dbContext == null) throw new ArgumentNullException("dbContext"); 
     _dbContext = dbContext; 
    } 

    public bool GetNewOrders(){ 
     return _dbContext.Orders.Where(o => o.IsNew==true); 
    } 

    public void Dispose() 
    { 
     if (_dbContext != null) _dbContext.dispose(); 
    } 
} 

public class OrderBLL : IOrderBLL 
{ 
    private readonly IOrderRepository _repository; 

    public OrderRepository(IOrderRepository repository) 
    { 
     if (repository == null) throw new ArgumentNullException("dbContext"); 
     _repository = repository; 
    } 

    public bool HasNewOrders(){ 
     var newOrders = _repository.GetNewOrders(); 
     if (newOrders==null) return false; 
     return newOrders.Count() > 0; 
    } 

} 


[Test] 
public void HasNewOrders_GivenNoNNewOrdersRetunedFromRepo_ReturnsFalse() 
{ 
    // test using nunit and nsubstitute 

    // Arrange 
    var repository = Substitue.For<IOrderRepository>(); 
    var emptyOrderList = new List<Order>(); 
    repository.GetNewOrders().Returns(); 
    var orderBLL = new OrderBLL(repository); 
    // Act 
    var result = orderBLL.HasNewOrders(); 
    // Assert 
    Assert.Equals(false, result); 
} 

このクラスにコンテキストを注入して、ビジネスロジックを簡単にテストできます。最終的には、dbContextを作成する必要があります。また、常にこれを公開する必要があります。私はあなたのオブジェクトの生活を管理するためにCastle WindsorのようなDIコンテナを見てみることをお勧めします。サービスでは、できるだけコードエントリポイントの近くであなたのコンテキストを手動で作成して処分したいだけかもしれません(例えば、メソッド)

+0

これは私がやろうとしていたものです。しかし、私は作成されているコンテキストを処分する方法を理解していませんでした。私はCastle Windsorを使用して調べます。その間、私はusingステートメントでOrderBLLをラップしています。OrderBLLはIdisposableを継承しています。次に、私は_dbcontextを破棄するOrderBLLにpublic disposeメソッドを持っています。使用staetmentはOrderBLLで作成したdisposeメソッドを呼び出しますか? – Mitch

+1

OrderBLLがIDisposableを実装する場合は、OrderBLL.dispose()メソッドのdbContextでdisposeを呼び出す必要があります。あなたはusingステートメントでOrderBLLをラップする必要があります。テストのためにNSubstitute(これはあなたのインターフェースが重要になる場所です)のような模倣ライブラリを見てみることをお勧めします。私はどのように表示するために上記の答えを更新します。 – Andrew

関連する問題