0

我有一个界面:

public interface IInterface
{
string Get(obj o);
}

我有两个课程:

public class C1 : IInterface
{
string Get(obj o);
}

public class C2 : IInterface
{
string Get(obj o);
}

我想发送 o,然后让 Ninject 根据 o 的属性确定它是哪个接口。obj 类似于:

public class obj
{
    public string Name {get;set;}
    public int Id {get;set;}
}

我想要这样的东西:

Bind<IInterface>().To<C1>.When(obj.Name == "C1");
Bind<IInterface>().To<C2>.When(obj.Name == "C2");

但我以前没有和 Ninject 合作过。有任何想法吗?

4

1 回答 1

1

我对你的问题的解释有点自由,因为我认为你已经跳过了一些“思考步骤”和必要的信息。

但是,我建议这样做:

public interface INamed
{
    string Name { get; }
}

public interface IFactory
{
    IInterface Create(INamed obj);
}

public class Factory : IFactory
{
    private readonly IResolutionRoot resolutionRoot;

    public Factory(IResolutionRoot resolutionRoot)
    {
        this.resolutionRoot = resolutionRoot;
    }

    public IInterface Create(INamed obj) 
    {
        return this.resolutionRoot.Get<IInterface>(obj.Name);
    }
}

替代方案:您也可以使用ninject 工厂扩展。遗憾的是,默认情况下它不支持命名绑定,但您可以自定义它,就像这里记录的那样。

但是坦率地说,我宁愿手动实现工厂,因为它更容易理解。如果我要自定义工厂 - 我已经完成了 - 我会考虑添加对属性的支持(指定如何处理工厂方法参数),而不是必须配置每个.ToFactory()绑定如何解释参数。

于 2014-09-16T16:34:37.373 回答