3

アーキテクチャ内の依存関係の問題を解決する方法を理解しようとして問題が発生しています。私は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について何も知りません。私のサービスはすでにコンストラクターに注入されています。だからここに私のオプションがあります:

  1. ICriteriaItemをコンストラクターに挿入するだけです。すべてのサービスでこれが注入されるため、これは汚い感じがします。ベースリポジトリでこれを行うことができると確信していますが、それでも汚い感じがします。

  2. カーネルを注入し、それをサービスで使用してICriteriaItemのインスタンスを取得します。さらに気分が悪くなります。

  3. ICriteriaItemの具象クラスを公開し、インターフェースを廃止するだけです。

  4. 別の方法を見つける...

考え?私はこれですべて間違っていますか?もっと良い方法はありますか?ここで何が欠けていますか?

4

2 に答える 2

4

CriteriaItem はデータ転送オブジェクトです。DTO は依存関係を持つべきではないため、Nnject を使用して作成しないでください。現在の実装は、あるべき姿です。

于 2012-08-04T23:30:59.353 に答える
2

ファクトリ パターンを使用して、それをAccountServiceコンストラクターに挿入できます。

public ICriteriaItemFactory
{
    ICriteriaItem GetNew();
}

これを実装するには、 IKernelの依存関係を受け入れる必要がありますが、少なくともコア クラスの 1 つにカーネルを注入していません。

public CriteriaItemFactory : ICriteriaItemFactory
{
    private IKernel _kernel;

    public CriteriaItemFactory(IKernel kernel)
    {
        _kernel = kernel;
    }

    public ICriteriaItem GetNew()
    {
        return _kernel.Get<ICriteriaItem>();
    }
}
于 2012-08-03T19:32:31.783 に答える