我正在研究一個解決方案,我希望跨WCF調用使用的MEF部分在應用程序級別存儲在單例中。這全部在IIS中託管。這些服務被裝飾成與asp.net兼容。
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
在Global.asax中,我導入了零件。
[ImportMany(typeof(IOption))]
public IEnumerable<IOption> AvailableOptions{ get; set; }
初始化目錄和容器後,我將導入的對象複製到我的單例類。
container.ComposeParts(this);
foreach (var option in AvailableOptions)
OptionRegistry.AddOption(option);
編輯:
我的註冊表類:
public static class OptionRegistry
{
private static List<IOption> _availableOptions= new List<IOption>();
public static void AddOption(IOption option)
{
if(!_availableOptions.Contains(option))
_availableOptions.Add(option);
}
public static List<IOption> GetOptions()
{
return _availableOptions;
}
}
這工作,但我想使它線程安全的所以一旦它這樣做我會發布該版本。
線程安全註冊地:
public sealed class OptionRegistry
{
private List<IOptionDescription> _availableOptions;
static readonly OptionRegistry _instance = new OptionRegistry();
public static OptionRegistry Instance
{
get { return _instance; }
}
private OptionRegistry()
{
_availableOptions = new List<IOptionDescription>();
}
public void AddOption(IOptionDescription option)
{
lock(_availableOptions)
{
if(!_availableOptions.Contains(option))
_availableOptions.Add(option);
}
}
public List<IOptionDescription> GetOptions()
{
return _availableOptions;
}
}
非常感謝Matthew的回覆。我喜歡你說的話。在此處列出它們以滿足每個人的利益 1. \t查看Core服務中MEF的使用情況或服務執行的某些功能。 2. \t容器創建相當便宜,而目錄創建可能很昂貴 – Nilesh 2011-06-09 05:05:52