나는 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의 여러 구체적인 인스턴스를 주입해야한다는 것을 알고 있어요 같은. 그냥 코드로 지적하고 실제로 무엇을하려고합니다. 코멘트에 제안으로
아마없는 뭔가를하지만, 왜 ISN 't'OrderCreator : ICreateOrders '? –
jbl
또는'ICreateOrders'는 ICreateOrders가 될 수 있습니다. 'Create'와'this.createOrders.First()'의 빈 구현은 달성하려는 것을 난처하게 만듭니다. –
jbl
jbl - 이것은 구체적인 유형입니다. 구현입니다. IOrderRequest 및 IOrderResponse를 구현하는 reqeust/reponse 클래스를 정의하는 구현 자의 많은 부분과 구현자가 있습니다. – MacGyver