2017-03-23 4 views
0

HomeControllerValueObjectを受け取り、状態someValueはDBで頻繁に変更されます。状態はコンストラクタで取得されます。Simple Injectorでインターフェイスを使用する具体的なオブジェクトを登録するにはどうすればいいですか?

HomeControllerにアクセスするたびにどのように私はIHomeControllerを使用してコンテナにHomeControllerを登録することができますので、新しいValueObjectが作成されただけでなく、それは状態も更新されています。

public class HomeController() 
{ 
    public HomeController(ValueObject value) 
    { 
    } 
} 

pubic class ValueObject() 
{ 
    public someValues { get; private set; } 

    public ValueObject(IValueRepository repository) 
    { 
     // The someValue changes very often in the system 
     someValue = repository.GetSomeValues(); 
    } 
} 
+0

あなたの例を更新してください。コードスニペットには質問の内容が反映されません。 – Nkosi

+1

これには 'IHomeController'は必要ありません。適切なDIコンテナを使用し、 'ValueObject'と' ValueRepository'を生涯 'PerRequest'で登録する必要があります。これは、すべての要求に対してそれらの新しいインスタンスを作成し、それらのメソッドを実行すると、すべての要求に対して新しい状態が得られます。私はHomeControllerをリポジトリに依存させ、リポジトリに 'ValueObject'のオブジェクトを返させることをお勧めします。 –

答えて

2

これは動作するはずです:

container.Register<HomeController>(); 
container.Register<ValueObject>(); 
container.Register<IValueRepository, SqlValueRepository>(); 

DIの観点から、そのコンストラクタでその依存関係を呼び出すので、あなたのValueObjectは、面倒です。しかしながら、注射コンストラクタ、should be simple and reliable

したがって、SomeValuesをキャッシュする場合は、デコレータを使用することをお勧めします。

public class HomeController 
{ 
    public HomeController(IValueRepository repository) 
    { 
    } 
} 

次のようにこれを登録することができます:

container.Register<HomeController>(); 
container.Register<IValueRepository, SqlValueRepository>(); 
container.RegisterDecorator<IValueRepository, CachingValueRepositoryDecorator>(); 
例えば

public class CachingValueRepositoryDecorator : IValueRepository 
{ 
    private readonly Lazy<SomeValues> values; 

    public CachingValueRepositoryDecorator(IValueRepository decoratee) 
    { 
     this.values = new Lazy<SomeValues>(decoratee.GetSomeValues); 
    } 

    public SomeValues GetSomeValues() => this.values.Value; 
} 

このようなデコレータは次のように簡単に見ることができHomeControllerValueObjectを持つ必要性を削除することができます

関連する問題