使用asp.net mvc 4的简单注入器,从另一个程序集加载控制器

时间:2013-01-21 10:38:07

标签: .net asp.net-mvc dependency-injection asp.net-mvc-4 simple-injector

我正在开发一个asp.net mvc 4站点,使用Simple Injector作为Ioc工具。它将是一个可插拔的架构。一些控制器和视图在另一个程序集中(另一个mvc4应用程序,Plugin.Web.dll)。从主应用程序,我知道Plugin.Web.dll的路径,加载插件。

container.RegisterMvcControllers(Assembly.GetExecutingAssembly());

container.RegisterMvcAttributeFilterProvider();

container.Options.AllowOverridingRegistrations = true;

var appPath = AppDomain.CurrentDomain.BaseDirectory;

string[] files = Directory.GetFiles(appPath + "\\Plugins", "*",
    SearchOption.AllDirectories);

foreach (var fileName in files)
{
    Console.WriteLine(fileName);

    var assembly = Assembly.LoadFrom(fileName);

    container.RegisterMvcControllers(assembly);

    var controllerTypes =
        from type in assembly.GetExportedTypes()
        where type.Name.EndsWith("Controller",
            StringComparison.Ordinal)
        where typeof(IController).IsAssignableFrom(type)
        where !type.IsAbstract
        select type;

    // Instead of verify:
    foreach (var type in controllerTypes)
    {
        container.GetInstance(type);
    }
}            

container.Options.AllowOverridingRegistrations = false;       

container.Verify();

DependencyResolver.SetResolver(
    new SimpleInjectorDependencyResolver(container));

它没有错误。

但是当我点击此单击时,在视图中:

@Html.ActionLink("plugin page","PluginPage","Plugin")

它提供'无法找到资源。,http 404'

提前致谢

1 个答案:

答案 0 :(得分:4)

我担心你不得不做更多的研究,因为你的问题目前有点模糊,但这里有一些指示:

检查System.Web.Compilation.BuildManager.GetReferencedAssemblies()是否返回插件程序集。 MVC DefaultControllerFactory在从该方法返回的所有程序集中搜索Controller类型。最好将插件文件夹放在/ bin目录中。如果我没有弄错GetReferencedAssemblies()也会查看/ bin的子目录。如果必须更加动态地加载插件,您可能需要编写自定义控制器工厂。

另请参阅this article,因为它描述了如何强制BuildManager了解您的插件程序集。

您的配置似乎过于复杂。以下配置也应该起到作用:

container.RegisterMvcControllers(Assembly.GetExecutingAssembly());

container.RegisterMvcAttributeFilterProvider();

var appPath = AppDomain.CurrentDomain.BaseDirectory;

string[] files = Directory.GetFiles(appPath + "\\bin\\Plugins", "*",
    SearchOption.AllDirectories);

container.RegisterMvcControllers(
    from fileName in files
    select Assembly.LoadFrom(fileName)
);    

container.Verify();

您可以查询容器的配置以查看其包含的内容。例如,这将查询所有已注册的控制器:

var registeredControllerTypes = (
    from registration in container.GetCurrentRegistrations()
    where typeof(IController).IsAssignableFrom(registration.ServiceType)
    select registration.ServiceType)
    .ToArray();