首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Web API & Simple Injector -从外部dll加载的问题解决控制器

Web API & Simple Injector -从外部dll加载的问题解决控制器
EN

Stack Overflow用户
提问于 2013-06-01 04:30:44
回答 1查看 874关注 0票数 0

我正在使用MVC4 Web API和简单注入器构建一个Web API,它应该公开各种CRUD和查询操作。在我的案例中使用IOC的原因是,我们是一家开发商店,我需要能够让客户构建自己的web api控制器,以公开他们需要从我们的系统公开所需的数据。因此,我希望以这样一种方式设计我的解决方案,允许我通过使所有控制器,无论是我们的还是我们客户的,都是外部的,并可通过IOC加载的方式来设计我自己的产品。

该网站没有任何对该库的引用,但该库包含我想在网站中使用的控制器。我有找到dll插件和加载控制器类型的代码,但当我试图导航到它所代表的路由时,它显示找不到它。

例如,如果我试图导航到/api/Test1Api,我应该看到文本"hello world“。

我这里的问题是,尽管我已经加载了我的控制器类型,但我无法将其转换为网站上所说的路由。

下面是我如何注册容器

代码语言:javascript
运行
复制
[assembly: WebActivator.PostApplicationStartMethod(typeof(Spike.Web.Api.App_Start.SimpleInjectorInitializer), "Initialize")]
public static class SimpleInjectorInitializer
{
    public static void Initialize()
    {
        // Create the IOC container.
        var container = new Container();

        InitializeContainer(container);

        container.RegisterMvcAttributeFilterProvider();
        // Verify the container configuration
        container.Verify();

        // Register the dependency resolver.
        GlobalConfiguration.Configuration.DependencyResolver =
                    new SimpleInjectorWebApiDependencyResolver(container);
        //DependencyResolver.SetResolver(new SimpleInjectorWebApiDependencyResolver(container));
    }

    private static void InitializeContainer(Container container)
    {
        var appPath = AppDomain.CurrentDomain.BaseDirectory;

        string[] files = Directory.GetFiles(appPath + "\\bin\\Plugins", "*.dll",
            SearchOption.AllDirectories);
        var assemblies = files.Select(Assembly.LoadFile);

        // register Web API controllers
        var apiControllerTypes =
            from assembly in assemblies
            where !assembly.IsDynamic
            from type in assembly.GetExportedTypes()
            where typeof(IHttpController).IsAssignableFrom(type)
            where !type.IsAbstract
            where !type.IsGenericTypeDefinition
            where type.Name.EndsWith("Controller", StringComparison.Ordinal)
            select type;

        // register MVC controllers
        var mvcControllerTypes =
            from assembly in assemblies
            where !assembly.IsDynamic
            from type in assembly.GetExportedTypes()
            where typeof(IController).IsAssignableFrom(type)
            where !type.IsAbstract
            where !type.IsGenericTypeDefinition
            where type.Name.EndsWith("Controller", StringComparison.Ordinal)
            select type;

        foreach (var controllerType in apiControllerTypes)
        {
            container.Register(controllerType);
        }

        foreach (var controllerType in mvcControllerTypes)
        {
            container.Register(controllerType);
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2013-06-01 09:39:59

我想通了!

因此,我在Web中创建了一个继承自DefaultAssembliesResolver的新类,名为CustomAssembliesResolver。实际上,我将我的程序集添加到查找控制器时解析的程序集列表中。对于解决方案的DI部分,我仍然有使用Simple Injector的代码。

代码语言:javascript
运行
复制
public class CustomAssembliesResolver : DefaultAssembliesResolver
{
    public override ICollection<Assembly> GetAssemblies()
    {
        var appPath = AppDomain.CurrentDomain.BaseDirectory;
        var baseAssemblies = base.GetAssemblies();
        var assemblies = new List<Assembly>(baseAssemblies);
        var files = Directory.GetFiles(appPath + "\\bin\\Plugins", "*.dll",
                        SearchOption.AllDirectories);
        var customAssemblies = files.Select(Assembly.LoadFile);

        // register Web API controllers
        var apiControllerAssemblies =
            from assembly in customAssemblies
            where !assembly.IsDynamic
            from type in assembly.GetExportedTypes()
            where typeof(IHttpController).IsAssignableFrom(type)
            where !type.IsAbstract
            where !type.IsGenericTypeDefinition
            where type.Name.EndsWith("Controller", StringComparison.Ordinal)
            select assembly;

        foreach (var assembly in apiControllerAssemblies)
        {
            baseAssemblies.Add(assembly);
        }

        return assemblies;
    }
}

我还将以下行添加到Global.asax.cs中App_Start的开头

代码语言:javascript
运行
复制
GlobalConfiguration.Configuration.Services.Replace(typeof(IAssembliesResolver), new CustomAssembliesResolver());

希望这对某些人有帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16868139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档