记录一次Stylet注册报错
注册代码
protected override void ConfigureIoC(IStyletIoCBuilder builder)
{
builder.Bind<IOrderProcessor>().To<OrderProcessorDecorator>().WithKey("Decorator");
builder.Bind<IOrderProcessor>().To<OrderProcessor>().WithKey("Default");
}
业务代码
public class Order
{
public int Id { set; get; }
public string Name { set; get; }
public int Count { set; get; }
public double Price { set; get; }
public string Desc { set; get; }
}
public interface IOrderProcessor
{
void Submit(Order order);
}
public class OrderProcessor : IOrderProcessor
{
public void Submit(Order order)
{
Console.WriteLine("提交订单00001");
}
}
/// <summary>
/// 这就相当于一个横向切面,去处理业务逻辑
/// </summary>
public class OrderProcessorDecorator : IOrderProcessor
{
public IOrderProcessor _IOrderProcessor;
public OrderProcessorDecorator(IOrderProcessor iorderprocessor)
{
_IOrderProcessor = iorderprocessor;
}
public void Submit(Order order)
{
PreProceed(order);
_IOrderProcessor.Submit(order);
PostProceed(order);
}
public void PreProceed(Order order)
{
Console.WriteLine("提交订单前,进行订单数据校验....");
if (order.Price < 0)
{
Console.WriteLine("订单总价有误,请重新核对订单。");
}
}
public void PostProceed(Order order)
{
Console.WriteLine("提交带单后,进行订单日志记录......");
Console.WriteLine(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "提交订单,订单名称:" + order.Name + ",订单价格:" + order.Price);
}
}
之所以注册失败,是因为
装饰器模式 和 依赖注入容器 的交互导致的循环依赖。Stylet 的 IoC 容器检测到 OrderProcessorDecorator 需要注入 IOrderProcessor,而 IOrderProcessor 又指向 OrderProcessorDecorator 自身,形成了无限递归。
正确写法是
protected override void ConfigureIoC(IStyletIoCBuilder builder)
{
// 注册核心实现(OrderProcessor)
builder.Bind<OrderProcessor>().ToSelf();
// 注册 IOrderProcessor 为装饰器
builder.Bind<IOrderProcessor>().ToFactory(c =>
new OrderProcessorDecorator(c.Get<OrderProcessor>()));
}

浙公网安备 33010602011771号