【问题标题】:how to get all the controller types from different assembly如何从不同的程序集中获取所有控制器类型
【发布时间】:2018-05-16 20:41:28
【问题描述】:

我正在实施自定义远程验证,我需要获取所有控制器,为此我使用了代码:

Type controller = Assembly.GetExecutingAssembly().GetTypes()
                .FirstOrDefault(type => type.Name.ToLower() == string.Format("{0}Controller",this.RouteData["controller"].ToString()).ToLower());

但是,问题是我的控制器和 viewModel 位于两个不同的程序集上,因此 Assembly.GetExecutingAssembly() 没有得到任何控制器。上面的代码在我有一个视图模型的程序集中。 我怎样才能从不同的组件中获取所有控制器。

【问题讨论】:

  • Assembly.Load()?
  • 如果你使用 ASP.NET Core,那么有一些类似于应用程序部件的东西可以让你从不同的程序集中加载控制器。docs.microsoft.com/en-us/aspnet/core/mvc/advanced/…
  • 我不知道你想要这些类型的目的是什么。
  • 康拉德有一个观点......在这种情况下,您将面临XY problem。康拉德建议的另一种选择是MEF

标签: c# .net validation model-view-controller


【解决方案1】:

我将假设您的第二个程序集被第一个程序集(持有您的视图模型的程序集)引用。您只需要获取引用的程序集并检查它是否已经加载,如果没有,则加载它,然后调用 GetTypes ,就像您已经执行的程序集一样。这是一个草图:

var assemblies = executingAssembly.GetReferencedAssemblies();
var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies().ToArray()();
foreach (var assemblyName in assemblies)
{
    var assembly = loadedAssemblies.FirstOrDefault(a => a.FullName == assemblyName.FullName) ??
                   AppDomain.CurrentDomain.Load(assemblyName);
    Type controller = assembly.GetTypes()
        .FirstOrDefault(type => type.Name.ToLower() == string.Format("{0}Controller",this.RouteData["controller"].ToString()).ToLower());
}

【讨论】:

    猜你喜欢
    • 2011-01-15
    • 1970-01-01
    • 2012-04-09
    • 2021-01-04
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多