2012-01-18 71 views
30

說,我有這樣的類層次結構:Ninject依賴注入Decorator模式

public interface IRepository { } 

public class SomeSimpleRepository : IRepository {} 

現在我想 「裝飾」 SomeSimpleRepository附加功能

public class MoreAdvancedRespository : IRepository 
{ 
    private readonly IRepository _originalRepository; 

    public MoreAdvancedRespository(IRepository original) 
    { } 
} 

一會兒另一個之後..

public class TrickyRepository : IRepository 
{ 
    private readonly IRepository _originalRepository; 

    public TrickyRepository (IRepository original) 
    { } 
} 

現在,我需要完成綁定。在應用程序中,我需要TrickyRepository的實例,用MoreAdvancedRespository進行初始化。所以,我需要寫類似:

Bind<IRepository>().To<TrickyRepository>.With ?? 

在這裏,我很困惑,我需要以某種方式說,採取MoreAdvancedRespository但SomeSimpleRepository初始化。這是一種必須依靠一個接口解決的依賴關係鏈。

對此有任何建議嗎?

+1

[如何使用Ninject與裝飾器完成綁定?](http://stackoverflow.com/questions/8447037/how-the-binding-are-done-with-decorators-using-ninject) – 2012-04-05 12:12:14

+2

[如何使用Ninject裝飾器完成綁定的可能的重複?](https://stackoverflow.com/questions/8447037/how-the-binding-are-done-with-decorators-using-ninject) – NightOwl888 2018-03-09 12:54:50

回答

40

使用WhenInjectedInto

Bind<IRepository>().To<MoreAdvancedRespository> 
        .WhenInjectedInto<TrickyRepository>(); 
Bind<IRepository>().To<SomeSimpleRepository> 
        .WhenInjectedInto<MoreAdvancedRespository>(); 

更多信息,請參見this blog post

+0

這正是我需要的 – 2012-01-18 16:27:18