2012-01-18 234 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