繁体   English   中英

Castle.Windsor CollectionResolver和组件订购

[英]Castle.Windsor CollectionResolver and Ordering of Components

我们使用Castle.Windsor(3.1)中的CollectionResolver注入一组组件。 这些顺序是相关的。 当前,我们在服务上使用Position属性来订购它们。

因为我们在具有不同组件集的不同应用程序中使用相同的主组件,所以位置属性是维护负担。 它意味着彼此之间的组件的知识。 同样,单个组件也不应该了解其他组件。

我们想要类似为特定服务类型注册多个IComparer<Type> ,以控制注入组件的顺序。

在Castle.Windsor中是否有一种简单的(预定义)方法来执行此操作,或者之前有人进行过此类操作?

我们要替换的示例:

interface IService
{
   bool Do();
   int Position { get; } // <= This should be kicked!
}

class Master
{
   private readonly IService[] _services;

   public Master(IService[] services)
   {
       // Master should not care about ordering also,
       // but injecting a sorter would be acceptable
       _services = services.OrderBy(s => s.Position).ToArray();
   }

   public void Do()
   {
       foreach(var service in _services)
       {
          if(!service.Do())
             break;
       }
    }
}

我们想要这样的东西,而没有使用这样的组件的Position:

class OrderService : IComparer<Type>
{       
   public int Compare(Type x, Type y)
   {
      if(typeof(MoreImportantComponent) == x)
         return -1;
      else
         return 0;

   }
}

您可以使用IHandlersFilter实现影响服务的顺序

public class ServiceHandlersFilter : IHandlersFilter
{
    private readonly List<Type> sortOrder = new List<Type>
                                                {
                                                   { typeof(Service1) },
                                                   { typeof(Service2) },
                                                   { typeof(Service3) },
                                                };

    public bool HasOpinionAbout(Type service)
    {
        return service == typeof(IService);
    }

    public IHandler[] SelectHandlers(Type service, IHandler[] handlers)
    {
        return handlers
            .OrderBy(h => sortOrder.IndexOf(h.ComponentModel.Implementation))
            .ToArray();
    }
}

您可能希望更优雅地确定排序顺序,例如,由组件本身确定。 如果是这种情况,请检查此RespectOrderDirectivesHandlersFilter实现。 根据过滤器上mookid的博客文章 ,您可以使用ExecutesBeforeAttributeExecutesAfterAttribute属性来为IService实现赋予属性,以暗示彼此执行的顺序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM