[英]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.Object
或dynamic
。 您不能將它們IHandle<ICommand>
為您嘗試過的IHandle<ICommand>
。 不允許這樣做,因為如果可以鍵入,將無法再保持安全性。
順便說一句,這不是ObjectFactory.GetAllInstances<IHandle<ICommand>>();
的原因ObjectFactory.GetAllInstances<IHandle<ICommand>>();
返回零項。 這是因為根本沒有注冊插件類型IHandle<ICommand>
實例。 您可能沒有實現IHandle<ICommand>
類型,但是可以完美地創建和注冊它們,並使用ObjectFactory.GetAllInstances<IHandle<ICommand>>()
獲取它們。
因此,如果可以使用System.Object
或dynamic
實例,則可以執行以下操作:
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);
}
更改object
以dynamic
的動態方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.