Я пытаюсь использовать MEF в своем приложении веб-формы ASP.NET для загрузки некоторых элементов управления из каталога во время выполнения.Я не получаю никакой ошибки, но элементы управления не загружаются.
Вот мой код -
aspx.cs
public partial class SampleMEF : System.Web.UI.Page
{
[ImportMany(typeof(IControlLoader))]
IEnumerable<Lazy<IControlLoader, IControlLoaderMetaData>> controls;
private CompositionContainer _partsContainer;
private AggregateCatalog _catalog;
private string _partsPath;
/// <summary>
/// default constructor
/// </summary>
public SampleMEF()
{
}
/// <summary>
/// Initialize the page
/// </summary>
/// <param name="e"></param>
protected override void OnInit(EventArgs e)
{
_partsPath = SPUtility.GetGenericSetupPath(@"TEMPLATE\LAYOUTS\MEFProtoType\Parts");
_catalog = new AggregateCatalog();
DirectoryCatalog c = new DirectoryCatalog(_partsPath, "*.dll");
_partsContainer = new CompositionContainer(c);
_partsContainer.ComposeParts(this);
}
protected void Page_Load(object sender, EventArgs e)
{
foreach(Lazy<IControlLoader, IControlLoaderMetaData> i in controls)
{
SPPControl ctrl = i.Value.LoadControl();
lbxControls.Items.Add(new ListItem(ctrl.Name, ctrl.ControlID.ToString()));
}
}
}
Контракты
/// <summary>
/// Contract for Imports and Exports
/// </summary>
public interface IControlLoader
{
SPPControl LoadControl();
}
/// <summary>
/// Exports metadata
/// </summary>
public interface IControlLoaderMetaData
{
string ControlID { get; }
}
Пример экспорта
[Export(typeof(IControlLoader))]
[ExportMetadata("ControlID", "7a6c6288-ab52-4010-8c56-79959843ec7c")]
public class ctrlAccordion : IControlLoader
{
#region IControlLoader Members
public SPPControl LoadControl()
{
SPPControl ctrl = new SPPControl("Accordion", new Guid("7a6c6288-ab52-4010-8c56-79959843ec7c"), 5);
return ctrl;
}
#endregion
}
Я вижу копии DLL, скопированные в каталог деталей.Но я не могу загрузить детали.Импорт не заполнен, и он пуст.
Я использую .Net Framework 3.5 и скачал dll MEF из MEF Codeplex и сам подписал сборку.
Есть идеи?