2017-10-12 9 views
2

나는 DI와 Ninject로 놀고있다. 나는 이것을 다른 방법으로 해결하는 방법에 대한 제안을하고있다. 필요한 경우 ICreateOrders의 구체적인 구현을 대체 할 수 있는지 확인하려고합니다. 어쩌면 다른 방법이나 패턴이 있을까요?공장에 대한 일반적인 인터페이스 의존성 주입

솔루션은 다음과 같습니다. C# - Ninject, IoC and factory pattern 괜찮 았지만 가능한 작성자를 공장에 주입하고 공장에서 OrderRequest를 기반으로 선택하도록했습니다. 이것은 작동하지 않습니다. kernel.Bind(typeof(ICreateOrders<,>)).To(typeof(OrderCreator))

왜 그런지 이해할 수는 없습니다. 그러나 OrderCreator에 대한 OrderCreator의 또 다른 서명 인> 또는 실제 매개 변수에 대한 Interfaces 및/또는 concrete 클래스 제공이 작동하지 않으며 이상적으로는 새 OrderCreator의 구현자가 수행해야하므로 이상적으로 필요하지 않습니다. 이

public class HorseOrderCreator : ICreateOrders<HorseOrderRequest, HorseOrderResponse> 
{ 
    public HorseOrderResponse Create() 
    { 
     throw new NotImplementedException(); 
    } 
} 

샘플 코드

using System; 
using Ninject; 
using System.Collections.Generic; 
using System.Linq; 

namespace NinjectPlatyGround 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var kernel = new StandardKernel();    
      kernel.Bind(typeof(ICreateOrders<,>)).To(typeof(OrderCreator)); 

      kernel.Bind<IOrderCreatorFactory>().To<OrderCreatorFactory>(); 

      var factory = kernel.Get<IOrderCreatorFactory>(); 

      var orderCreator = factory.GetOrderCreator(new OrderRequest()); 

     } 
    } 
    public class OrderRequest : IOrderRequest 
    { 

    } 
    public class OrderResponse : IOrderResponse 
    { 

    } 
    public class OrderCreator : ICreateOrders<OrderRequest, OrderResponse> 
    { 
     public OrderResponse Create() 
     { 
      throw new NotImplementedException(); 
     } 
    } 
    public class OrderCreatorFactory : IOrderCreatorFactory 
    { 
     private readonly IEnumerable<ICreateOrders<IOrderRequest, IOrderResponse>> createOrders; 
     public OrderCreatorFactory(IEnumerable<ICreateOrders<IOrderRequest, IOrderResponse>> createOrders) 
     { 
      this.createOrders = createOrders; 
     } 

     public ICreateOrders<IOrderRequest, IOrderResponse> GetOrderCreator(IOrderRequest orderRequest) 
     { 
      //Based on orderRequest i find the implementation i need. 
      return this.createOrders.First(); 

     } 
    } 
    public interface ICreateOrders<TOrderRequest, TOrderResponse> where TOrderRequest : IOrderRequest where TOrderResponse : IOrderResponse 
    { 
     TOrderResponse Create(); 
    } 
    public interface IOrderCreatorFactory 
    { 
     ICreateOrders<IOrderRequest, IOrderResponse> GetOrderCreator(IOrderRequest orderRequest); 
    } 
    public interface IOrderRequest 
    { 

    } 
    public interface IOrderResponse 
    { 

    } 
} 

내가 Ninject에이 공장에서 나에게는 IEnumerable을 제공하기 위해 ICreatorOrders의 여러 구체적인 인스턴스를 주입해야한다는 것을 알고 있어요 같은. 그냥 코드로 지적하고 실제로 무엇을하려고합니다. 코멘트에 제안으로

+0

아마없는 뭔가를하지만, 왜 ISN 't'OrderCreator : ICreateOrders '? – jbl

+1

또는'ICreateOrders'는 ICreateOrders가 될 수 있습니다. 'Create'와'this.createOrders.First()'의 빈 구현은 달성하려는 것을 난처하게 만듭니다. – jbl

+0

jbl - 이것은 구체적인 유형입니다. 구현입니다. IOrderRequest 및 IOrderResponse를 구현하는 reqeust/reponse 클래스를 정의하는 구현 자의 많은 부분과 구현자가 있습니다. – MacGyver

답변

2

, 당신은 당신이 다음 쓸 성공적으로 해결할 수 있어야한다 ICreateOrders

ICreateOrders<out TOrderRequest, out TOrderResponse> 

로 지정하려고 할 수 있습니다 : 명백한

kernel.Bind(typeof(ICreateOrders<,>)).To(typeof(OrderCreator))