0

My Entityクラスはリポジトリに依存しています。コンテナへの参照の受け渡しやCommonServiceLocatorのEntityFactoryの使用を避ける方法

public class User 
{ 
    private readonly IUserRepository _userRepository; 

    public User(IUserRepository userRepository) 
    { 
     _userRepository = userRepository; 
    } 

    ... 
} 

また、エンティティを作成するためにリポジトリで使用されるEntityFactoryクラスがあります。

コンテナへの参照を持つEntityFactoryやCommonServiceLocatorを使用しないようにする方法はありますか? (Context Agnostic)

私はクラスを間違って設計していますか?Userクラスはリポジトリに依存してはいけませんか?編集

:ここであるデビッドからメソッドを使用してコード:

// Ninject binding 
Bind<Func<User>>().ToMethod(cxt =>() => new User(cxt.Kernel.Get<IUserRepository>())); 

// EntityFactory class 
private readonly Func<User> _userFactory; 
public EntityFactory(Func<User> userFactory) 
{ 
    _userFactory = userFactory; 
} 
public User InstantiateUser() 
{ 
    return userFactory.Invoke(); 
} 
+0

'ServiceLocator.Current.GetInstance ()'または '_kernel.Get ()'を呼び出すことはできませんか? – Steven

答えて

1

あなたのDIフレームワークは、工場を作成する方法を提供する必要がありますEntityFactoryが作成されると

public class EntityFactory 
{ 
    public EntityFactory(Func<User> userFactory) { /* ... */ } 

    public User InstantiateUser() 
    { 
     return userFactory.Invoke(); 
    } 
} 

それは、その後の参照せずに適切に解決ユーザを作成するために使用することができ、適切User工場を受け取りますIoCに送信する。

+0

はい、これは私が探しているようです。私はまだいくつかのFunc 私のEntityFactoryの工場のフィールドを持っていることについては確信していません。 DIスタイルに合うようにコードをあまりにも変更するようです。ユニットテストではどのように動作しますか? – Rudy

+0

@Rudy:EntityFactoryがファクトリメソッドを呼び出すだけの場合は、すべて一緒に使用しないでください。ファクトリ作成をカプセル化/キャッシュ/メモ化する小さなFactoryByTypeCacheを作成する方法もあります。ユニットテストでは、コンテナ内のファクトリデリゲートをオーバーライドしたり、EntityFactoryを完全に置き換えることができます。 (リポジトリパターンも参照してください) –

0

オプション2または3で何が悪いのでしょうか? IoCまたはサービスロケータを使用している場合は、どこかへの参照が必要です。

私はIoCコンテナをグローバルに参照しており、これを使用してすべての場所でインターフェイスを解決します。これはサービスロケータによく似ていますが、代わりにIoCコンテナを使用します。

私はそこに道があるとは思わない。

+1

オプション2または3を使用すると、IoCを切り替えるのが非常に難しくなります。また、同じappdomain内で2つの異なる設定を使用することもできます。適切な使用シナリオでは、コンポーネントを登録し、オーケストレーターで「アプリケーション」を解決する場合にのみ、IoCへの参照が必要です。 –

+0

私はオプション2が実際にこれを実装していると考えており、EntityFractoryをインスタンス化するときにIoCコンテナを渡す必要があります。私はいくつかの 'ThreadStatic'リファレンス(現在のリクエストのコンテキスト)に基づいてIoCコンテナを切り替えるオプションを持つ静的クラスラッパーを持つことによってIoCを実装しました。しかしながら、IoCコンテナが例えばIsoCコンテナに固有である場合には、単に第2の「AppDomain」を作成することも可能である。モジュールまたはプラグイン。 –

関連する問題