【问题标题】:Using Microsoft.Extension.DependencyInjection in Asp.net Web Api2在 Asp.net Web Api2 中使用 Microsoft.Extension.DependencyInjection
【发布时间】:2018-10-25 18:26:28
【问题描述】:

我正在尝试实现 Asp.Net webApi 项目,该项目依赖于第三方框架,该框架使用 HttpContext.Current 做很多事情,而这在 Asp.net Core 中不存在。这就是为什么我无法创建面向 .net 完整框架的 Asp.net Core Web 应用程序。

所以我创建了带有 WebApi 扩展的老式 Asp.net Web 应用程序项目。

现在我正在尝试使用 Microsoft.Extension.DependencyInjection 框架。

我找到了 Asp.Net Mvc4 的 this 示例,但我的项目是 WebApi。这种方法行不通。谁能提供链接或代码sn-p让我继续前进?

P.S:提供示例时,请确保它不应该使用 OWIN 框架。因为当我尝试使用 OWIN 管道时,第三方库(闭源)无法正常工作。

【问题讨论】:

    标签: dependency-injection asp.net-web-api2


    【解决方案1】:

    不久前我还发现了that 示例,我使它在两个方面都能完美运行 Asp.Net Mvc4 和 WebApi2 项目。

    为WebApi项目使用一些IoC容器(例如Unity、Autofac),最重要的是实现接口IDependencyResolver来制作你自己的依赖解析器。

    她的我的 WebApi 项目的代码 sn-p。

    WebApiConfig

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            ...
    
            // using Microsoft.Extension.DependencyInjection here.
            Startup.Bootstrapper(config);
        }
    }
    

    启动

    public class Startup
    {
        public static void Bootstrapper(HttpConfiguration config)
        {
            var provider = Configuration();
            var resolver = new DefaultDependencyResolver(provider);
    
            config.DependencyResolver = resolver;
        }
    
        private static IServiceProvider Configuration()
        {
            var services = new ServiceCollection();
    
            services.AddControllersAsServices(typeof(Startup).Assembly.GetExportedTypes()
                .Where(t => !t.IsAbstract && !t.IsGenericTypeDefinition)
                .Where(t => typeof(IHttpController).IsAssignableFrom(t)
                            || t.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)));
    
            var serviceProvider = services.BuildServiceProvider();
    
            return serviceProvider;
        }
    }
    

    DefaultDependencyResolver

    public class DefaultDependencyResolver : IDependencyResolver
    {
        private IServiceScope serviceScope;
        protected IServiceProvider ServiceProvider { get; set; }
    
        public DefaultDependencyResolver(IServiceProvider serviceProvider)
        {
            this.ServiceProvider = serviceProvider;
        }
    
        public object GetService(Type serviceType)
        {
            return this.ServiceProvider.GetService(serviceType);
        }
    
        public IEnumerable<object> GetServices(Type serviceType)
        {
            return this.ServiceProvider.GetServices(serviceType);
        }
    
        public IDependencyScope BeginScope()
        {
            serviceScope = this.ServiceProvider.CreateScope();
            return new DefaultDependencyResolver(serviceScope.ServiceProvider);
        }
    
        public void Dispose()
        {
            // you can implement this interface just when you use .net core 2.0
            // this.ServiceProvider.Dispose();
    
            //need to dispose the scope otherwise
            //you'll get a memory leak
            serviceScope?.Dispose();
        }
    }
    

    ServiceProviderExtensions

    public static class ServiceProviderExtensions
    {
        public static IServiceCollection AddControllersAsServices(this IServiceCollection services,
            IEnumerable<Type> controllerTypes)
        {
            foreach (var type in controllerTypes)
            {
                services.AddTransient(type);
            }
    
            return services;
        }
    }
    

    【讨论】:

    • 感谢您的解决方案。确认有点晚了。
    • 这很好并且有效,但有一个小建议:不清楚您想要注入控制器构造函数的任何实例/类型,需要添加到服务集合。从我有限的测试来看,解析器似乎需要将“injectibles”和“injectees”作为服务添加。
    • 优秀答案@Hin Liang
    • 在同一个应用程序中同时使用 mvc 和 web api 的 .net 4.x 中,仅设置 HttpConfiguration.DependencyResolver 仅适用于我的 web api,对于 mvc,我还必须设置 System.Web。 Mvc.DependencyResolver 使用 System.Web.Mvc.IDependencyResolver 与 System.Web.Http.Dependencies.IDependencyResolver 不同。参考:stackoverflow.com/questions/15494920
    猜你喜欢
    • 2023-03-31
    • 2015-07-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 2015-03-04
    • 2016-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多