ASP.NET经典版OWIN启动时ConfigureServices未被调用

11

我正在编写一个ASP.NET经典版的WebAPI应用程序。 我已实现了OWIN StartUp类,Configuration方法已被执行,但是ConfigureServices方法没有被执行。我知道这对于DotNetCore是起作用的。

using Microsoft.Extensions.DependencyInjection;
using Microsoft.Owin;
using Owin;


[assembly: OwinStartup(typeof(ClassicWebApi.Startup))]

namespace ClassicWebApi
{
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            //CODE IS NOT EXECUTED
        }
        public void Configuration(IAppBuilder app)
        {
            //CODE IS EXECUTED
        }


    }
}

这只是DotNetCore的一个特性还是我需要在设置中包含另一个库?


ConfigureServices(IServiceCollection services) 方法仅适用于 ASP.NET Core,为何在 ASP.NET Web API 中需要它? - Win
3
我希望使用依赖注入。具体来说,是使用AddDbContext和AddScoped。 - franzke
3个回答

4

我想使用依赖注入。具体来说是AddDbContext和AddScoped

内置的依赖注入仅适用于ASP.NET Core。您需要使用第三方IoC容器,例如 -


我猜那可能是答案。我希望能够使用Microsoft.Extensions.DependencyInjection库。这次我将继续使用Autofac。谢谢您的回复。 - franzke
1
这并不一定是真的。你可以在.NET框架中使用Microsoft依赖注入包。 - Visualize

1
如果您想在使用WebAPI的ASP.NET中使用DI,则可以考虑使用Unity。
Unity是为现有的传统ASP.NET应用程序添加DI的最佳库。使用它,您甚至可以将DI添加到任何内容中,包括WebForms。 软件包:
<package id="Microsoft.AspNet.WebFormsDependencyInjection.Unity" version="1.0.0" targetFramework="net472" />
<package id="Unity" version="5.2.0" targetFramework="net472" />
<package id="Unity.Abstractions" version="3.3.0" targetFramework="net472" />
<package id="Unity.Container" version="5.8.6" targetFramework="net472" />
<package id="Unity.WebAPI" version="5.3.0" targetFramework="net472" />

Global.ascx:

public class Global : System.Web.HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        UnityConfigWebForms.RegisterComponents(this, AppConfig.WebAppSettings._authType);
        UnityConfigWebAPI.RegisterComponents(AppConfig.WebAppSettings._authType);
        ...existing code...

示例类:

public static class UnityConfigWebAPI
{
    public static void RegisterComponents(WebAppSettings.AuthenticationTypes authenticationType)
    {
        var container = new UnityContainer();
        container.RegisterType<IWesTest, WesTest>(new Unity.Injection.InjectionConstructor("hi wesley, webapi"));

        //container.RegisterType<IAuthenticationService>(new InjectionFactory(c =>
        //{
        //    IAuthenticationManager mgr = HttpContext.Current.GetOwinContext().Authentication;
        //    System.Type generic = System.Type.GetType("CGI_Automation_Framework.AuthenticationEngines." + authenticationType);
        //    object ad = System.Activator.CreateInstance(generic, mgr);
        //    return ad;
        //}));

        GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
    }
}

示例 WebAPI 类:

[Authorize]
public class TagController : ApiController
{
    private AppStart.IWesTest _auth;

    public TagController(AppStart.IWesTest auth)
    {
        this._auth = auth;
    }

0

您可以在非Core项目中使用Microsoft.Extensions.DependencyInjection。您只需从Global.asax的Application_Start方法中调用ConfigureServices(IServiceCollection services)即可。


9
如何解决?Application_Start 没有引用到 IServiceCollection 或 Startup 实例。 - Jake
没有足够的信息来提供有用的回答。请点踩。 - user2966445

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接