Использование MEF с приложением asp.net для веб-форм (SharePoint) - PullRequest
1 голос
/ 02 июня 2011

Я пытаюсь использовать 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 и сам подписал сборку.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 02 июня 2011

Хорошо, я в конце концов нашел проблему. Я могу загрузить dll детали, только если я подпишу их и добавлю dll в глобальную сборку. Но я не понимаю, что DirectoryCatalog делает загрузку папки.

Итог: если dll находятся только в папке деталей, а не в GAC, они не загружаются.

1 голос
/ 03 июня 2011

Могут возникнуть проблемы при попытке загрузить сборки из произвольных мест. В разделе «Проблемы с загрузкой сборки» этого сообщения в блоге есть немного информации об этом и ссылки на дополнительную информацию.

Вы также можете проверить каталог в отладчике, чтобы увидеть, загружал ли он какие-либо детали.

...