如何在 .net 中获取所有组合和未来组合的 MEF 部分的控制器

How to get all composed and future composed MEF part's controllers in .net

我正在尝试创建一个通用支付处理器,它可以通过使用 MEF 组合在运行时作为模块添加。我目前有代码可以组成所有可用的 .dll 并通过访问其控件成功测试它。

我目前希望能够从 compositionContainer 中获取所有可用的控制器。我到处都看过,但只找到那些调用控制器的控制器,这些控制器不在其他地方,而是在主项目中。

我的问题是,我怎样才能访问当前组成的所有控制器,而不仅仅是通过其合同名称找到它。因为我想枚举它们并相应地调用某些方法

这就是我编写 dll 的方式,我有一个处理组合的自定义引导程序,然后是一个 MefControllerFactory,它根据合同名称处理控制器的提取。

using System;
using System.Web.Mvc;
using System.ComponentModel.Composition.Hosting;
using System.Linq;
using System.Web.Routing;
using System.Web.SessionState;
using System.Composition;
using System.Collections.Generic;
using System.Diagnostics.Contracts;

namespace Dependency_Injection_MEF_MVC.Components
{
    public class MefControllerFactory : IControllerFactory
    {
        //private string pluginPath;
        //private DirectoryCatalog catalog;
        //private CompositionContainer container;


        private DefaultControllerFactory _defaultControllerFactory;

        public MefControllerFactory(){

            _defaultControllerFactory = new DefaultControllerFactory();
            //this.pluginPath = pluginPath;
            //this.catalog = new DirectoryCatalog(pluginPath);
            //this.container = new CompositionContainer(catalog);

            //this.defaultControllerFactory = new DefaultControllerFactory();
        }

        public IController CreateController(RequestContext requestContext, string controllerName)
        {


            if (controllerName.Contains("Home") || controllerName.Contains("Bundels"))
                return _defaultControllerFactory.CreateController(requestContext,controllerName);


                var controller = Bootstrapper.GetInstance<IController>(controllerName);

            if (controller == null)
                throw new Exception("Controller not found!");

            return controller;

        }




        public SessionStateBehavior GetControllerSessionBehavior(RequestContext requestContext, string controllerName)
        {
            return SessionStateBehavior.Default;
        } 

        public void ReleaseController(IController controller)
        {
            var disposableController = controller as IDisposable;

            if (disposableController != null)
            {
                disposableController.Dispose();
            }
        }

    }

}

经过大量研究,我想出了如何通过使用 compositionContainer 来实现这一点 Bootstrapper.getInstance 只是调用 CompositionContainer.getExportedValue<T>()

    ViewBag.count = Bootstrapper.getCompositionContainer().Catalog.Count();`

    List<String> controllerstoImport = new List<string>();
    foreach(var cat in Bootstrapper.getCompositionContainer().Catalog){
        foreach(var cats in cat.ExportDefinitions){
            controllerstoImport.Add(cats.ContractName);
        }
    }

    List<IController> MEFcontrollers = new List<IController>();

    foreach(var contractName in controllerstoImport){
        MEFcontrollers.Add(Bootstrapper.GetInstance<IController>(contractName));
    }
    List<Type> compoundControllerType = new List<Type>();

    foreach(var controllerType in MEFcontrollers){
        compoundControllerType.Add(controllerType.GetType());
    }

然后这就是我从 MEF 模块控制器中提取所有方法的方法 列表方法List = new List();

    foreach (var controllersInfo in compoundControllerType){
        listo.Add(controllersInfo.GetMethods());
    }
    List<String> methods = new List<string>();


    foreach(var method in methodList){
        foreach (MethodInfo info in method){
            methods.Add(info.Name);
        }
    }

终于成功了,进行了比需要更多的研究。我相信有更好更快的解决方案,所以如果有人有任何代码改进请留下另一个答案。谢谢!