I持ってこのリポジトリは、ドメインサービスへのIoCコンテナを注入されたので、同じように使用されてIDisposableを
public class Repository : IRepository, IDisposable
{
private readonly IUnitOfWork UnitOfWork;
private SqlConnection Connection;
public Repository(IUnitOfWork unitOfWork, connectionString)
{
UnitOfWork = unitOfWork;
Connection = new SqlConnection(connectionString);
Connection.Open();
}
public MyObject FindBy(string userName)
{
//...Ado .Net command.ExecuteReader, etc.
}
}
次ADOの.Netリポジトリ:
public class UserDomainService : IUserDomainService
{
private readonly IRepository Repository;
public UserDomainService(IRepository repository)
{
Repository = repository;
}
public User CreateNewUser(User user)
{
using(Repository)
{
var user = Repository.FindBy(user.UserName);
if(user != null)
throw new Exception("User name already exists!");
Repository.Add(user);
Repository.Commit();
}
}
}
アイデア私はリポジトリオブジェクトを常にusingステートメントに入れているので、接続が閉じられて処分されますが、ドメインサービスクラスがまだ生存していて、それに2度目の呼び出しがあるので問題として認識しますリポジトリがすでに破棄されているため失敗します。
私はすべてのコードを完全にコントロールしています。粗い穀物サービスの呼び出しのみを設計したいのですが、すべてが正しいとは思わないものがあります。
私はこのようにしているので、ドメインサービスはリポジトリのOpenConnectionとCloseConnectionのメソッドを知っていることを避けることができます。
このデザインは本質的に悪いですか、これを行う良い方法がありますか?考え後
:要求が到着したときにすべての依存関係ツリーは、WCFレベルで生成され、それはリポジトリのコンストラクタで起こるので、もちろんあなたは、接続がその時点で開いていることがわかりますので、私はそれを信じていますこの特定のコールの期間だけ開いているので、それほど悪くはありません。私はこの前提に慣れているのですか、それともプロセスの早い段階でDB接続を開くことによって何か悪いことをしていますか?
'IRepository'は' Repository'と密接に結びついていますか?意味、それには 'Find'のようなメソッドが含まれていますか?もしそうなら、そのインタフェースは 'IDisposable'を暗示しますか? –
私はこれに関連するかもしれない私自身の質問があります:[ServiceContainer、IoC、および使い捨てオブジェクト](http://stackoverflow.com/questions/556580/servicecontainer-ioc-and-disposable-objects)。 –
なぜ 'リポジトリ'に 'SqlConnection'が必要ですか?あなたの 'IUnitOfWork'にもっと似ています。 – Steven