0

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

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

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

// 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 方法?

4

1 回答 1

0

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

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

kernel.Bind<IModelValidator>()
      .ToProvider<ModelValidatingFactory>();
kernel.Bind<ModelValidatingFactory>()
      .ToConstant(new ModelValidatingFactory(/*pass your parameter */));
于 2013-05-30T17:31:17.173 回答