九拒绝重新绑定方法

本文关键字:绑定 方法 拒绝 新绑定 | 更新日期: 2023-09-27 18:30:03

使用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
}

我正在使用Ninjectmvc扩展,并有我的NinjectModule实现:

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

回到我的问题,是否可以重新绑定方法GetPeople(),使其使用PersonFacadeStub中的实现,但IPersonFacade一直使用PersonFacade中的GetName?

九拒绝重新绑定方法

我认为这是不可能的。NInject和其他DI容器一样管理类型,而不是方法。如果您想对相同接口模式的不同方法使用不同的类型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>());