アーキテクチャ内の依存関係の問題を解決する方法を理解しようとして問題が発生しています。私はNHibernateを使用しており、そのICriteriaインターフェイスを独自のICriteriaItemインターフェイスで抽象化しようとしています。ICriteriaItemは私のリポジトリインターフェースで使用されています:
ICriteriaItem.cs
public interface ICriteriaItem
{
string PropertyName { get; set; }
object Value { get; set; }
}
IUserRepsository.cs
public interface IUserRepository
{
IEnumerable<User> Find(IList<ICriteriaItem> criteria);
}
私のサービスレイヤーは、AccountServiceでこのリポジトリを使用しています
AccountService.cs
public class AccountService : IAccountService
{
private IUserRepository _userRepo;
private IRoleRepository _roleRepo;
public AccountService(IUserRepository userRepository,
IRoleRepository roleRepository)
{
_userRepo = userRepository;
_roleRepo = roleRepository;
}
public ValidateUser(string username, string password)
{
password = HashPassword(password);
_userRepo.Find(new List<ICriteriaItem>() {
new CriteriaItem() { "Username", username },
new CriteriaItem() { "Password", password},
});
}
}
私の問題は、NinjectでCriteriaItemのインスタンスを取得することです。すべてのバインディングはMVCレイヤーで行われ、現在、サービスレイヤーはNinjectについて何も知りません。私のサービスはすでにコンストラクターに注入されています。だからここに私のオプションがあります:
ICriteriaItemをコンストラクターに挿入するだけです。すべてのサービスでこれが注入されるため、これは汚い感じがします。ベースリポジトリでこれを行うことができると確信していますが、それでも汚い感じがします。
カーネルを注入し、それをサービスで使用してICriteriaItemのインスタンスを取得します。さらに気分が悪くなります。
ICriteriaItemの具象クラスを公開し、インターフェースを廃止するだけです。
別の方法を見つける...
考え?私はこれですべて間違っていますか?もっと良い方法はありますか?ここで何が欠けていますか?