如何创建Ninject工厂

时间:2013-05-30 17:12:14

标签: c# .net wpf inversion-of-control ninject

我有一个抽象的工厂。今天,我想用ninject绑定它。我不知道哪种方式最好,但我这样做了。然后我很努力,我尝试了提供者的方式。所以 我实现了提供程序接口。问题是,我以这种方式打电话kernel.Bind<IModelValidator>().ToProvider<ModelValidatingFactory>()

我不能使用ModelValidatingFactory的IModelValidatingFactory,所以我必须给出一个参数什么是工厂(列表)。 我想为IModelValidator接口创建一个工厂。我想使用类类型作为键。我如何为构造函数提供参数,或者哪种方法可以使其工作?我应该使用什么密钥,因为如果我使用类型我必须传递它,我不喜欢使用字符串作为类型

我观看了Ninject的.ToFactory方法,但我不明白。我看到更多的实施可能性。你对我有什么建议?

// this is what I would like to try, but there are some error with this. I can not reference to the type, and I can not give factory
     public class ModelValidatingFactory : Provider<IModelValidator>, TandoCare.Desktop.Infrastructure.ModelValidating.IModelValidatingFactory
        {
            public IDictionary<Type, Func<IModelValidator>> validationFactory = new Dictionary<Type, Func<IModelValidator>>();

            public ModelValidatingFactory(IDictionary<Type, Func<IModelValidator>> factory)
            {
                //validationFactory.Add(typeof(PatientModel), () => new PatientRegistrationValidator());
                validationFactory = factory;
            }

            protected override IModelValidator CreateInstance(Ninject.Activation.IContext context)
            {
                return validationFactory[context.Request.Target.Type]();
            }

            public IModelValidator GetValidator(object model)
            {
                Type type = model.GetType();
                return validationFactory[type]();
            }

            public IModelValidator this[object lookedType]
            {
                get
                {
                    Type type = lookedType.GetType();
                    return validationFactory[type]();
                }
            }
        }

我应该如何以这种方式使用.ToFactory方法?

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你担心的是你想为你的工厂提供一个特定的构造函数参数,那个构造函数参数不是Ninject知道如何绑定的东西。

您应该能够设置绑定,以便Ninject知道如何生成工厂的实例。像这样:

kernel.Bind<IModelValidator>()
      .ToProvider<ModelValidatingFactory>();
kernel.Bind<ModelValidatingFactory>()
      .ToConstant(new ModelValidatingFactory(/*pass your parameter */));