c# - 无法使用 Simple Injector 注册 Api Controller?

标签 c# asp.net asp.net-mvc dependency-injection simple-injector

我有一个使用 Simple Injector 的 WebApi,它工作得非常好,但我必须在项目中实现 OAuth。现在我已经做到了,我的 ApiControllers 给了我一个错误,比如 Simple Injector 现在已经正确设置

我有我的 Start.cs 文件

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // Web API configuration and services
        HttpConfiguration config = new HttpConfiguration();

        Container container = SimpleInjectorConfig.Initialize(app);

        ConfigureAuth(app, container);

        WebApiConfig.Register(config);

        app.UseWebApi(config);
    }

    public void ConfigureAuth(IAppBuilder app, Container container)
    {
        var OAuthServerOptions = new OAuthAuthorizationServerOptions()
        {
            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/token"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
            Provider = container.GetInstance<IOAuthAuthorizationServerProvider>()
        };

        // Token Generation
        app.UseOAuthAuthorizationServer(OAuthServerOptions);
        app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

    }
}

在我的 SimpleInjectorConfig 文件中,我有
public class SimpleInjectorConfig
{
    public static Container Initialize(IAppBuilder app)
    {
        var container = GetInitializeContainer(app);

        container.Verify();

        GlobalConfiguration.Configuration.DependencyResolver = 
            new SimpleInjectorWebApiDependencyResolver(container);

        return container;
    }

    public static Container GetInitializeContainer(IAppBuilder app)
    {
        var container = new Container();

        container.RegisterSingle<IAppBuilder>(app);

        container.Register<IOAuthAuthorizationServerProvider, 
            ApiAuthorizationServerProvider>();

        // myService
        container.Register<IService, MyService>();

        // myRepository
        container.Register<IRepository, MyRepository>();

        // This is an extension method from the integration package.
        container.RegisterWebApiControllers(GlobalConfiguration.Configuration);

        return container;
    }
}

public class ApiAuthorizationServerProvider : OAuthAuthorizationServerProvider
{
    private IService _service;

    public ApiAuthorizationServerProvider(IService service)
    {
        _service = service;
    }

    public override async Task ValidateClientAuthentication(
        OAuthValidateClientAuthenticationContext context)
    {
        context.Validated();
    }

    public override async Task GrantResourceOwnerCredentials(
        OAuthGrantResourceOwnerCredentialsContext context)
    {
        context.OwinContext.Response.Headers
            .Add("Access-Control-Allow-Origin", new[] { "*" });

        User user = _service.Query(e => e.Email.Equals(context.UserName) &&
            e.Password.Equals(context.Password)).FirstOrDefault();

        if (user == null)
        {
            context.SetError("invalid_grant", 
                "The user name or password is incorrect.");
            return;
        }

        var identity = new ClaimsIdentity(context.Options.AuthenticationType);
        identity.AddClaim(new Claim("sub", context.UserName));
        identity.AddClaim(new Claim("role", "user"));

        context.Validated(identity);

    }
}

现在我的项目构建良好,但我无法测试 OAuth 是否正常工作,因为我无法连接到我的 ApiController。我还没有将 [Authorize] 标签添加到 Controller 中,所以我应该能够访问它。

这是我的 Controller
public class MyController : ApiController
{
    private IService _service;

    public MyController(IService service)
    {
        _service = service;
    }

    public IHttpActionResult Get()
    {
        // get all entities here via service
        return Ok(list);
    }

}

我收到的错误消息说

An error occurred when trying to create a controller of type 'MyController'. Make sure that the controller has a parameterless public constructor.



我以为这将通过注册
container.RegisterWebApiControllers(GlobalConfiguration.Configuration);

最佳答案

在 .NET Core 中添加:

// Sets up the basic configuration that for integrating Simple Injector with
// ASP.NET Core by setting the DefaultScopedLifestyle, and setting up auto
// cross wiring.
services.AddSimpleInjector(_container, options =>
{
    // AddAspNetCore() wraps web requests in a Simple Injector scope and
    // allows request-scoped framework services to be resolved.
    options.AddAspNetCore()
        .AddControllerActivation();
});
通过 https://simpleinjector.readthedocs.io/en/latest/aspnetintegration.html

关于c# - 无法使用 Simple Injector 注册 Api Controller?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26002866/

相关文章:

c# - ASP.NET c# 将参数值传递给 Crystal 报表

javascript - jQuery 函数在我的 MVC 应用程序中不起作用

asp.net-mvc - 将 DataAnnotation 属性从 Model 应用到 ViewModel

c# - 将嵌套循环重构为单个 LINQ 查询

c# - 你可以将 'expanded' 数组传递给 C# 中的函数,就像在 ruby​​ 中一样吗?

c# - 在括号之间捕获并按字符拆分

c# - 控制台与 Windows 窗体上的 Process.WaitForExit()

asp.net - ASP.NET Core WebAPI 中的 AAD V2 与 JwtBearer

c# - 关于从 ASP.NET 2.0 到 ASP.NET 3.5 MVC 的区别的问题

asp.net - Code First 启用迁移