簡體   English   中英

使用structuremap獲取和/或彈出通用接口的所有實現

[英]Getting and/or ejecting all implementations of a generic interface using structuremap

我目前有一個界面

public interface IHandle<T> where T : ICommand
{
  void Invoke(T command);
}

在結構映射中,可以通過以下類型的調用獲取IHandle的任何特定實現,因此我知道所有處理程序都存在於StructureMap中。

var commandHandler = ObjectFactory.GetInstance<IHandle<SomeCommand>>();

但是,我想做的就是獲取(或彈出,這就是我的最終目標)如果有IHandle的所有實例。

我嘗試了以下失敗的嘗試

// compile error because it doesn't have a type
ObjectFactory.GetAllInstances<IHandle<>>();

// returns 0 items
ObjectFactory.GetAllInstances<IHandle<ICommand>>();

// has runtime error of "Cannot create arrays of open type."
ObjectFactory.GetAllInstances(typeof(IHandle<>));

有誰知道如何獲取通用接口的所有實例?

謝謝你的幫助

如果您的目標是彈出它們,則可以使用以下代碼:

ObjectFactory.Model.EjectAndRemovePluginTypes(x => 
    x.IsGenericType &&
    x.GetGenericTypeDefinition() == typeof(IHandle<>)
    );

可以獲取所有實例,但是您只能將它們存儲為System.Objectdynamic 您不能將它們IHandle<ICommand>為您嘗試過的IHandle<ICommand> 不允許這樣做,因為如果可以鍵入,將無法再保持安全性。

順便說一句,這不是ObjectFactory.GetAllInstances<IHandle<ICommand>>();的原因ObjectFactory.GetAllInstances<IHandle<ICommand>>(); 返回零項。 這是因為根本沒有注冊插件類型IHandle<ICommand>實例。 您可能沒有實現IHandle<ICommand>類型,但是可以完美地創建和注冊它們,並使用ObjectFactory.GetAllInstances<IHandle<ICommand>>()獲取它們。

因此,如果可以使用System.Objectdynamic實例,則可以執行以下操作:

IEnumerable<IPluginTypeConfiguration> handlers =
    ObjectFactory.Model.PluginTypes
                       .Where(x => x.PluginType.IsGenericType &&
                                   x.PluginType.GetGenericTypeDefinition() == 
                                                       typeof (IHandle<>));

var allInstances = new List<object>();

foreach (IPluginTypeConfiguration pluginTypeConfiguration in handlers)
{
    var instancesForPluginType = 
              ObjectFactory.GetAllInstances(pluginTypeConfiguration.PluginType)
                           .OfType<object>();

    allInstances.AddRange(instancesForPluginType);
}

更改objectdynamic的動態方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM