如何正确使用带有参数的Ninject的NamedLikeFactoryMethod?

时间:2018-08-13 08:51:29

标签: c# ninject ninject-extensions

我有一个使用Ninject的C#控制台应用程序。

如果我使用以下代码运行它,则控制台会显示:“ 创建了一个名为Dogy的狗,他已经7岁了”。

由于我在Program.cs的Main()-方法中将7作为参数传递给我,所以这个结果实际上对我来说很好,但是感觉就像我没有在我的“ PettModul.cs”中正确使用扩展方法“ NamedLikeFactoryMethod”一样类,因为我可以输入任何字符串和整数作为参数,并且结果仍然相同。我是否使用“ NamedLikeFactoryMethod”错误?如果是这样,我该如何正确使用它?

我有以下代码:

Program.cs

class Program
{
    static void Main(string[] args)
    {
        var kernel = new StandardKernel();
        kernel.Load(new TierModul());
        var factory = kernel.Get<IPetFactory>();
        var dogy = factory.GetDog("Dogy",7);            
        Console.ReadLine();
    }
}

Dog.cs

public class Dog: IPet
{
    private readonly string _name;
    private readonly int _age;        

    public Dog(string name, int age)
    {
        _age= age;
        _name = name;
        Console.WriteLine($"A Dog with the name {_name} was created, he is{_age} years old");
    }
}

IPetFactory.cs

 public interface IPetFactory
{
    IPet GetDog(string name, int age);
    IPet GetCat(string name);
}

PetModul.cs

public class PetModul : NinjectModule
{
    public override void Load()
    {            
        Bind<IPet>().To<Dog>().NamedLikeFactoryMethod((IPetFactory f) => f.GetDog("name",1));           

        Bind<IHaustierFactory>().ToFactory();
    }
}

1 个答案:

答案 0 :(得分:1)

那是因为

Bind<IPet>().To<Dog>().NamedLikeFactoryMethod((IPetFactory f) => f.GetDog("name",1))

等效于:

Bind<IPet>().To<Dog>().Named("Dog")

Ninject的对流是,一旦您用'Get'前缀命名工厂方法,该方法就将用于此方法其余部分的绑定。

NamedLikeFactoryMethod只是为了避免使用任何硬编码的字符串。