web api 自托管自定义 ioc 将数据注入控制器

Posted

技术标签:

【中文标题】web api 自托管自定义 ioc 将数据注入控制器【英文标题】:web api self host custom ioc inject data to controllers 【发布时间】:2015-12-31 03:43:32 【问题描述】:

我的 web api 自托管应用程序中有一个属性,我想将它注入到我的控制器中,该属性是使用我的自定义 IoC 框架通过反射加载的,这是我的启动代码:

public CustomClass StuffInstance  get; set; 


// This method is required by Katana:
public void Configuration(IAppBuilder app)

    ConfigureOAuth(app);
    var webApiConfiguration = ConfigureWebApi();

    // Use the extension method provided by the WebApi.Owin library:
    app.UseWebApi(webApiConfiguration);

我的控制器大多是脚手架,有些像:

// PUT: api/EventTypeDescriptions/5
[ResponseType(typeof(void))]
public IHttpActionResult PutStuff(int id, int something)

    //do stuff
    //here i would like to use StuffInstance like a singleton
    return StatusCode(HttpStatusCode.NoContent);
  

如何将 StuffInstance 注入我的控制器?顺便说一句,此信息将与任何制作 IoC 框架的人相关

【问题讨论】:

您的 IoC 使用什么?您需要将 IoC 解析器分配给配置,并创建一个代表 CustomClass 的接口。 它是一个自定义的东西,但我可能正在考虑使用 autofac,我可以使用我的自定义解析器以某种方式注入实例吗? 用什么没关系;你只需要使用一些东西。你必须注册你的控制器并在他们被请求时为它们解决依赖关系,而你在这里没有做任何类似的事情。 我赞成您建议我使用接口的评论,但我仍然不知道如何将实例注入我的控制器,有任何信息吗?也许是我需要阅读的信息的链接? 我为您添加了一个 AutoFac 示例。希望对您有所帮助! 【参考方案1】:

我在此链接中找到了将实例注入我的控制器的信息:

http://www.asp.net/web-api/overview/advanced/dependency-injection

基本上我为我的自定义 IoC 库实现了一个依赖解析器

如果有人遇到同样的问题,这里是代码,也许对于其他 IoC 框架它需要更多的工作

public class CustomIocDependencyResolver : IDependencyResolver

    private readonly CustomIoc container;

    public ComponentLoaderWebApiDependencyResolver(CustomIoc container)
    
        this.container = container;
    

    IDependencyScope IDependencyResolver.BeginScope()
    
        return new CustomIocDependencyResolver(container);
    

    Object IDependencyScope.GetService(Type serviceType)
    
        return container.GetInstance(serviceType);
    

    IEnumerable<Object> IDependencyScope.GetServices(Type serviceType)
    
        return container.GetAllInstances(serviceType);
    

    public void Dispose()
    
    

现在我的武士刀配置如下:

    // This method is required by Katana:
    public void Configuration(IAppBuilder app)
    
        ConfigureOAuth(app);
        var config = ConfigureWebApi();

        config.DependencyResolver = CustomIocDependencyResolver(container);

        // Use the extension method provided by the WebApi.Owin library:
        app.UseWebApi(config);
    

作为我的自定义 IoC 实例的容器

【讨论】:

【参考方案2】:

由于您提到 AutoFac 作为潜在候选者,我建议您关注他们的 tutorial 关于 WebAPI 集成。您需要在 CustomClass 上定义一个接口,以便正确注入它。

您需要通过将其注册为实例组件来注入您创建的实例(因为您希望将其视为单例)。

public interface ICustomClass 
public class CustomClass : ICustomClass 

public CustomClass _stuffInstance = new CustomClass();

public class Startup

    public void Configuration(IAppBuilder app)
    
        ConfigureOAuth(app);

        var builder = new ContainerBuilder();
        var config = new HttpConfiguration();

        builder.RegisterApiControllers(Assembly.GetExecutingAssembly());

        builder.RegisterInstance(_stuffInstance).As<ICustomClass>();

        var container = builder.Build();
        config.DependencyResolver = new AutofacWebApiDependencyResolver(container);

        app.UseAutofacMiddleware(container);
        app.UseAutofacWebApi(config);
        app.UseWebApi(config);
    

然后,在每个控制器的构造函数中,注入绑定到相应接口的实例。

public class CustomController : ApiController

    private readonly ICustomClass _customClass;

    public CustomController(ICustomClass customClass)
    
        _customClass = customClass;
        

【讨论】:

【参考方案3】:

使用 ASP.NET Core 6,您现在可以注册服务提供者:

builder.Services.AddScoped<ICustomClass, CustomClass>(sp => new CustomClass()/* or your already existing instance */);
builder.Services.AddSingleton<ICustomClass>(sp => new CustomClass()/* or your already existing singleton instance */);

它将被注入到您的控制器中:

[Route("api/[controller]")]
[ApiController]
public class MyController : ControllerBase

    private readonly ICustomClass _customClass;
    private readonly ILogger _logger;

    public MyController(ICustomClass customClass, ILogger<MyController> logger)
    
        _customClass = customClass;
        _logger = logger;
    

【讨论】:

谢谢,这在我升级时会有用!

以上是关于web api 自托管自定义 ioc 将数据注入控制器的主要内容,如果未能解决你的问题,请参考以下文章

自定义一个IOC框架

转换 Web API 以使用自托管

在自托管 Web 服务器环境中通过 POST REST API 上传 C# 文件

强大的自托管服务器的最佳选择:WCF 与 ASP.NET Web Api

asp.net web api 自托管 / owin / katana

使用 web api 自托管获取客户端的 IP 地址