2013-05-30 2 views
0

나는 추상적 인 공장을 가지고 있습니다. 오늘 저는 그걸 묶어서 묶고 싶었습니다. 가장 좋은 방법은 무엇인지 모르겠지만 이런 식으로했습니다. 그럼 난 힘들어 나는 공급자 방식대로 노력했다. 그래서 나는 공급자 인터페이스를 구현했다. 문제는, 내가 이런 방식으로 호출한다는 것입니다. kernel.Bind<IModelValidator>().ToProvider<ModelValidatingFactory>()Ninject 팩토리를 만드는 방법

ModelValidatingFactory의 IModelValidatingFactory insted를 사용할 수 없으므로 factory (list)가 무엇인지 매개 변수를 지정해야합니다. IModelValidator 인터페이스를위한 팩토리를 만들고 싶습니다. 클래스 유형을 키로 사용하고 싶습니다. 생성자에 대한 매개 변수를 어떻게 제공 할 수 있습니까? 아니면 작동하게하는 가장 좋은 방법은 무엇입니까? 유형을 사용하면 유형을 사용할 필요가 없기 때문에 키를 사용해야합니까?

Ninject의 메소드를 보았지만 이해가되지 않습니다. 더 많은 구현 가능성을 보았습니다. 너 나 한테 뭐라고 조언 해?

// 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 메서드를 사용해야합니까?

답변

0

내가 올바르게 이해한다면, 귀하의 우려는 공장에 특정 생성자 인수를 제공하고 그 생성자 인수가 Ninject가 바인딩하는 방법을 알지 못하는 것입니다.

Ninject가 팩토리의 인스턴스를 생성하는 방법을 알 수 있도록 바인딩을 설정할 수 있어야합니다. 이 같은 것 :

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

내 문제에 대한 공장을 어떻게 만들면 좋을까요? 가장 좋은 해결책은 어디서나 생성자를 던지거나 속성에 주입해야합니다. – user1693057

+0

@ user1693057 : 공장을 소비하려는 클래스에 대해 이야기하고 있습니까? 나는 개인적으로 생성자 주입을 선호하지만 각각의 장단점을 찾기 위해 "Constructor vs Property Injection"이라는 단어를 사용할 수 있습니다. – StriplingWarrior

관련 문제