データアクセスのためにリポジトリを使用していましたが、作業ユニットのパターンに似たものは何も実装していませんでした。私はRavenDBとASP.NET MVCを使って自己教育のための新しいプロジェクトを始めました(理論的には些細でなければならない細部)。ビジネストランザクションをラップするための良い方法を確立しようとしています(ではなくウェブリクエスト)仕事の単位は、しかし、いくつかの難しさをそうしています。作業ユニットからリポジトリにデータコンテキストを渡す
次のコードスニペットは、私が見てようをいただきたいものです。
public class UserService : IUserService
{
private readonly IRepository<User> _userRepository;
private readonly IRepository<Role> _roleRepository;
public UserService(
IRepository<User> userRepository,
IRepository<Role> roleRepository)
{
_userRepository = userRepository;
_roleRepository = roleRepository;
}
public void Register(User user)
{
using (var session = UnitOfWork.Begin())
{
_userRepository.Create(user);
_roleRepository.AddToRole(user, Role.Public);
session.Commit();
}
}
}
は、ワークインターフェースの単位での私の最初の刺し傷は、次のようになります。
私は「public interface IUnitOfWork : IDisposable
{
void Commit();
}
public class UnitOfWork : IUnitOfWork
{
private readonly IDocumentSession _session;
public UnitOfWork(IDocumentStore documentStore)
{
_session = documentStore.OpenSession("http://from:config");
}
public void Commit()
{
_session.SaveChanges();
}
public static IUnitOfWork Begin()
{
return IoC.GetInstance<IUnitOfWork>();
}
public void Dispose()
{
_session.Dispose();
}
}
m stuckは、リポジトリのデータベースセッションへのアクセスです。私が言及したように、私は商取引を自分の単位で包んでいます。私はまたセッション/コンテキストを各メソッドに渡すことに熱心ではなく、私が見た他のほとんどのソリューションは静的メソッドやストレージをWebセッションのようなもので使用しています。これらのすべてが私を少し不快にさせます。このユニット全体のコンセプトに欠けているものがありますか?
あなたは、2つの追加オプションがあります。 2. Commitメソッドで行われたすべての変更(追加、削除、変更)を追跡し、これらすべての変更を調整するカスタムUnitOfWork実装を設計します。 –