DI を設定しようとして、ちょっとした障害にぶつかりました。
したがって、このコントローラーがあるとします:
public UsersController(IUnitOfWork unitOfWork)
{
// Stuff
}
以前、リポジトリに直接アクセスするこの UnitOfWork 実装がありました。
public class UnitOfWork : IUnitOfWork, IDisposable
{
private readonly DbContext _context = new DbContext();
public IRepository<User> Users { get { return new UserRepository(_context); } }
}
Ninject UnitOfWork コード:Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();
これで実際にうまく動作します。ただし、リポジトリを含む UnitOfWork の代わりに、複数のリポジトリを取り込むサービスが含まれるように変更したいと考えています。
public class UserService : IUserService
{
private readonly IUserRepository _userRepository;
public UserService(IUserRepository userRepository, /* Other repositories */)
{
_userRepository = userRepository;
}
}
今私が思いつくことができる唯一の解決策は
public class UnitOfWork : IUnitOfWork, IDisposable
{
private readonly DbContext _context = new DbContext();
public IUserService UserService
{
get
{
return new UserService(new UserRepository(_context), /* etc. */);
}
}
}
これは正しくないようです。現在、すべてのサービスの依存関係を自分で作成しています。
StackOverflow の投稿で、コントローラー (MVC アプリケーション) に心配させるよりも、サービスに複数のリポジトリにアクセスさせてビジネス ロジックを処理させる方がよいと述べているのを見たことがあります。
ただし、実際にこれを適切に行う方法についての詳細は見つかりません。では、Ninject を使用して目的を達成するにはどうすればよいでしょうか?