2012-04-04 150 views
2

使用Ninject我想重新绑定一个方法到另一个实现是可能的?Ninject重新绑定方法

我会阐述,我有两个不同的实现这个接口:

public interface IPersonFacade 
{ 
    List<string> GetPeople(); 
    string GetName(); 
} 

public class PersonFacade:IPersonFacade 
{ 
    //Implement Interface fetching data from a db. 
} 

public class PersonFacadeStub:IPersonFacade 
{ 
    //Implement Interface with some static data 
} 

我使用Ninject MVC扩展,并有我的NinjectModule实现:

public class ServiceModule:NinjectModule 
{ 
    public override void Load() 
    { 
    Bind<IPersonFacade>().To<PersonFacade>(); 
    } 
} 

所以,回到我的问题,是否有可能重新绑定方法GetPeople(),因此它使用PersonFacadeStub中的实现,但是IPersonFacade继续使用PersonFacade中的GetName?

回答

2

我不认为这是可能的。像任何其他DI容器一样,NInject管理类型,而不是方法。如果你想使用不同类型相同的接口模式的不同方法Composite可以帮助:

public class CompositePersonFacade : IPersonFacade 
{ 
    private readonly IPersonFacade realFacade; 
    private readonly IPersonFacade stubFacade; 

    public CompositePersonFacade(IPersonFacade realFacade, IPersonFacade stubFacade) 
    { 
     this.realFacade = realFacade; 
     this.stubFacade = stubFacade; 
    } 

    public List<string> GetPeople() 
    { 
     return stubFacade.GetPeople(); 
    } 

    public string GetName() 
    { 
     return realFacade.GetName(); 
    } 
} 

,并修改绑定:

Bind<IPersonFacade>().To<CompositePersonFacade>() 
    .WithConstructorArgument("realFacade", 
        context => context.Kernel.Get<PersonFacade>()) 
    .WithConstructorArgument("stubFacade", 
        context => context.Kernel.Get<PersonFacadeStub>()); 
+0

好,感谢您的帮助 – Nicolai 2012-04-04 15:18:04

+0

+1尼斯。 @Nizolai看看Ninject.Extensions.Interception是否可以使用(取决于你是否希望从字面上寻找你想要的内容......) – 2012-04-04 19:40:25