2

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

4

1 回答 1

2

我不认为这是可能的。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>());
于 2012-04-04T15:04:57.490 回答