【问题标题】:How to configure Web API 2 and Structure Map如何配置 Web API 2 和结构图
【发布时间】:2014-08-26 18:03:43
【问题描述】:

我浏览了多个博客等,试图找出如何使用 Web API 2 配置 StructureMap,但没有一个实现对我有用。混淆似乎在于 MVC 使用的不同 IDependency Resolver 和 Web API 使用的 IDependency Resolver。

首先,哪个是正确的 Nuget 包,其次,如何使用纯 Web API 2 项目对其进行配置?

谢谢

这是我到目前为止所拥有的,它似乎正在工作。这是正确的吗?

 public class StructureMapControllerActivator : IHttpControllerActivator
{
    private readonly IContainer _container;

    public StructureMapControllerActivator(IContainer container)
    {
        if (container == null) throw new ArgumentNullException("container");
        _container = container;
    }

    public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
    {
        try
        {
            var scopedContainer = _container.GetNestedContainer();
            scopedContainer.Inject(typeof(HttpRequestMessage), request);
            request.RegisterForDispose(scopedContainer);
            return (IHttpController)scopedContainer.GetInstance(controllerType);
        }
        catch (Exception e)
        {
            // TODO : Logging
            throw e;
        }
    }
}

【问题讨论】:

标签: asp.net-web-api structuremap asp.net-web-api2


【解决方案1】:

有一个 nuget:https://www.nuget.org/packages/WebApi.StructureMap/

public class Global : System.Web.HttpApplication
{
    protected void Application_Start(object sender, EventArgs e)
    {
        GlobalConfiguration.Configuration.UseStructureMap<Registry>();

        // Or

        GlobalConfiguration.Configuration.UseStructureMap(x =>
        {
            x.AddRegistry<Registry1>();
            x.AddRegistry<Registry2>();
        });

        ...
    }
}

【讨论】:

    【解决方案2】:

    链接很少,我是否试图解释我们如何(轻松地)同时使用 StructureMap 和 Web API:

    我们必须实现IHttpControllerActivator,这可以从已经配置的StructureMap ObjectFactory中获益:

    public class ServiceActivator : IHttpControllerActivator
    {
        public ServiceActivator(HttpConfiguration configuration) {}    
    
        public IHttpController Create(HttpRequestMessage request
            , HttpControllerDescriptor controllerDescriptor, Type controllerType)
        {
            var controller = ObjectFactory.GetInstance(controllerType) as IHttpController;
            return controller;
        }
    }
    

    然后,我们只需要注册我们的实现(global.asax)

    protected void Application_Start()
    {
        ...
        HttpConfiguration config = GlobalConfiguration.Configuration;
        config.Services
              .Replace(typeof(IHttpControllerActivator), new ServiceActivator(config));
        ...
    

    【讨论】:

    • 什么已经配置的对象工厂......我被告知它在下载结构图后不存在
    猜你喜欢
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 2017-12-04
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 2018-01-27
    • 2016-12-16
    相关资源
    最近更新 更多