繁体   English   中英

将 MEF 与 asp.net web 表单应用程序一起使用 (SharePoint)

[英]Using MEF with asp.net web form application (SharePoint)

我试图在我的 ASP.NET web 表单(SharePoint)应用程序中使用 MEF 在运行时从目录加载一些控件。 我没有收到任何错误,但没有加载控件。

这是我的代码 -

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 并从 MEF Codeplex 下载了 MEF dll 并自己签署了程序集。

有任何想法吗?

好的,我终于找到了问题所在。 只有当我签署它们并将 dll 添加到全局程序集中时,我才能加载部件 dll。 但我不明白DirectoryCatalog加载文件夹的内容。

底线:如果 dll 只是在部件文件夹中而不是在 GAC 中,它们就不会被加载。

尝试从任意位置加载程序集时可能会出现问题。 这篇博文的“装配负载问题”部分提供了一些关于此的信息以及指向更多信息的链接。

您还可以在调试器中检查目录以查看它是否加载了任何部分。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM