如何在 .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);
}
}
终于成功了,进行了比需要更多的研究。我相信有更好更快的解决方案,所以如果有人有任何代码改进请留下另一个答案。谢谢!
我正在尝试创建一个通用支付处理器,它可以通过使用 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);
}
}
终于成功了,进行了比需要更多的研究。我相信有更好更快的解决方案,所以如果有人有任何代码改进请留下另一个答案。谢谢!