我正在尝试使用DI和Ninject。如果需要,我希望确保ICreateOrders的具体实现可以被替换。也许还有其他方式或设计模式?欢迎提供建议。
像这样的解决方案:C# - Ninject, IoC and factory pattern也不错,但我希望将可能的创建者注入到工厂中,并且根据OrderRequest选择其中一个。
但这种方法不起作用。
kernel.Bind(typeof(ICreateOrders<,>)).To(typeof(OrderCreator))
我可以理解为什么不行。即使将OrderCreator的签名改为OrderCreator<,>,或者实际上将接口和/或具体类提供给泛型参数,也不起作用。理想情况下,我不想这样做,因为新的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
{
}
}
我知道我需要注入多个ICreatorOrders的具体实例,以便Ninject在工厂中给我一个IEnumerable。这段代码只是在展示我实际上想要做什么。
OrderCreator : ICreateOrders<IOrderRequest, IOrderResponse>
呢? - jblICreateOrders
可以是 ICreateOrders<out TOrderRequest, out TOrderResponse>。Create
的空实现和this.createOrders.First()
有些模糊了你想要实现的目标。 - jbl