簡體   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