如何在不调用 setter 注入的情况下丰富 StructureMap 中的对象组合?

2024-01-25

我正在尝试构建一个实现IHttpControllerActivator与 StructureMap 的接口,这样我就可以解决控制器的依赖关系,该控制器依赖于HttpRequestMessage正在 MVC Web API 管道中进行处理。

我的实施Create如下:

public IHttpController Create(
    HttpRequestMessage request,
    HttpControllerDescriptor controllerDescriptor,
    Type controllerType)
{
    return (IHttpController)this.Container
        .With(request)
        .With(controllerDescriptor)
        .GetInstance(controllerType);
}

The Container属性是对 StructureMap 的引用IContainer实例在构造时传递给激活器。

我对控制器的注册使用反射来获取所有ApiController实施:

foreach(var controller in this.GetType().Assembly.GetTypes()
    .Where(type => typeof(ApiController).IsAssignableFrom(type)))
{
   this.For(controller).Use(controller);
}

使用调试器,我检查了控制器实例的初始化并传递了它们的依赖项。然而,当ExecuteAsync在控制器上调用方法,抛出异常:

无法重用“ApiController”实例。必须根据传入消息构造“ApiController”。检查您的自定义“IHttpControllerActivator”并确保它不会制造相同的实例。

经过一些挖掘和实验后,我发现这是由于在开始时执行的检查所致ExecuteAsync它检查Request的财产ApiController查看它是否已被赋值。如果该属性具有非空值,则表明控制器已用于处理请求并中止操作。

除此之外,我验证了 StructureMap 在编写控制器时尝试使用其 setter 注入行为,并负责Request具有非空值。

在我的注册表中,我没有配置任何设置器注入,所以我很困惑为什么在这里调用它。关于如何改变所展示的行为,对 StructureMap API 的研究并没有给出任何明显的答案。

我是否错误地调用了 StructureMap?是否有一个配置设置可以用来表示“永远不要分配属性值”?


我认为你的问题围绕着你设置控制器的方式StructureMap。为了使其正常工作,最好的方法是通过创建您自己的实现来挂钩 WebAPI 堆栈的依赖项注入堆栈IDependencyResolver。有一个很好的例子http://craigsdevspace.wordpress.com/2012/02/26/using-structuralmap-with-web-api/ http://craigsdevspace.wordpress.com/2012/02/26/using-structuremap-with-web-api/

不过,基本代码可能类似于:

依赖解析器:

public class _DependencyResolver : _DependencyScope, IDependencyResolver {

    public _DependencyResolver(IContainer container) : base(container) { }

    public IDependencyScope BeginScope() {
        return new _DependencyScope(_container);
    }
}

依赖范围:

public class _DependencyScope : ServiceLocatorImplBase, IDependencyScope {
    protected readonly IContainer _container;

    public _DependencyScope(IContainer container) {
        if (container == null)
            throw new ArgumentNullException("container");

        _container = container;
    }

    public override object GetService(Type serviceType) {
        if (serviceType == null)
            return null;

        try {
            return (serviceType.IsAbstract || serviceType.IsInterface)
                ? _container.TryGetInstance(serviceType)
                : _container.GetInstance(serviceType);
        } catch {
            return null;
        }
    }

    protected override object DoGetInstance(Type serviceType, string key) {
        if (string.IsNullOrEmpty(key))
            return _container.TryGetInstance(serviceType);

        return _container.TryGetInstance(serviceType, key);
    }

    protected override IEnumerable<object> DoGetAllInstances(Type serviceType) {
        return _container.GetAllInstances<object>().Where(s => s.GetType() == serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType) {
        return _container.GetAllInstances<object>().Where(s => s.GetType() == serviceType);
    }

    public void Dispose() {
        //_container.Dispose();
    }

}

要将这些类连接到 WebAPI,您可以将以下内容添加到Global.asax:

GlobalConfiguration.Configuration.DependencyResolver = 
    new _DependencyResolver(ObjectFactory.Container);

并且无论是在Global.asax或者在你的Bootstrapper,您将添加以下内容:

ObjectFactory.Initialize(x => {
    x.Scan(scanner => scanner.AddAllTypesOf<ApiController>());
});

这将设置您的StructureMap实现使用堆栈预先存在的注入结构 - 这应该避免您遇到的问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不调用 setter 注入的情况下丰富 StructureMap 中的对象组合? 的相关文章

  • 通过查询字符串传递“Bearer”时 SignalR 身份验证失败

    我想在 SignalR 中启用身份验证 而服务器托管在 ASP NET WebAPI 中 我使用 OAuth Bearer 身份验证 客户端是 AngularJS 在客户端 我最初通过 HTTP 标头传递 Bearer 令牌 它与 WebA
  • WCF 与 WebAPI 和本机移动设备

    我一直在开发一个完全基于 ajax 的单页 Web 应用程序 无 POST 现在我在开发过程中使用 ASMX 来提供 Web 服务 Web 服务使用 JSON 数据 对于该版本 我知道我需要升级到 WCF 或 WebAPI 最终 我计划构建
  • 向 ASP.NET WebApi 2.2 添加身份验证

    我创建了一个 WebApi 2 2 项目 来自一个空的新 ASP NET 项目 来证明一些实现概念 现在我想向其中添加身份验证 我注意到在新的 WebApi 应用程序上添加身份验证的唯一方法是使用模板之一 在我的例子中是 VS 2013 是
  • Autofixture 和 WebApi 控制器

    我正在使用 AutoFixture 尝试测试 WebApi 站点的控制器 我正在将 AutoData 功能与 Moq 一起使用 如上所述普洛的博客 http blog ploeh dk 2010 10 08 AutoDataTheories
  • 适用于移动应用程序的 REST API 上的 OAuth

    我正在开发移动应用程序的后端 使用 ASP NET MVC 4 Web Api 构建 RESTful API 该应用程序将在 iOS 和 Android 上运行 我的用户将只能使用他们的 Facebook 帐户登录 并且只有登录后 他们才能
  • 扩展授权属性

    我实施了 CustomAuthorization 属性基于 Authorize 属性 我的属性如下所示 public class CustomAuthorizeAttribute AuthorizeAttribute public eUse
  • 如何检查DBContext是否已释放?

    我想与从外部 继承类 调用的另一个方法共享数据库上下文 而不创建新的上下文 除非正在释放它 我想检查上下文是否已处理 以便我可以创建新的上下文 这是休息 api 有多个实体的批量上传 我想共享事务 因此如果一个实体失败 它将不会提交到数据库
  • 使用 HttpClient 从 webapi 消费 xml

    我使用 WebClient 从 Restfull 服务 net web api 获取 Xml 对象 一切都运行良好 using WebClient client new WebClient client Encoding UTF8Encod
  • 如何访问Web api控制器中的mvc控制器以从视图中获取pdf

    我为单页 Web 应用程序创建了 Web Api 和 MVC 组合 我想调用 Web api 并渲染 mvc 控制器以使用 Rotativa api 从视图创建 pdf 问题是当我在 Web api 中访问 mvc 控制器时它不起作用 我如
  • 如何让 HttpClient 将凭据与请求一起传递?

    我有一个与 Windows 服务通信的 Web 应用程序 托管在 IIS 中 Windows 服务使用 ASP Net MVC Web API 自托管 因此可以使用 JSON 通过 http 进行通信 Web 应用程序被配置为进行模拟 其想
  • 防止整数值在 ASP.NET Web API 模型绑定中设置布尔参数?

    我正在开发一个 ASP NET Web API 其中的方法采用以下模型作为输入参数 public InputModel int Id get set bool IsTrue get set 它适用于 true 和 false 值 我尝试检查
  • 当 URL 包含 ASP.Net Core 参数的“+”时出现 404 错误

    当参数包含编码为空格的空格时 我的服务器返回 404 错误 代替 20 我不明白为什么 路线的形式为 Route Search PRM1 prm1 PRM2 prm2 PRM3 prm3 我的第一个问题是如何让服务器理解这种 URL htt
  • Web API 复杂参数属性均为 null

    我有一个 Web API 服务调用可以更新用户的首选项 不幸的是 当我从 jQuery ajax 调用中调用此 POST 方法时 请求参数对象的属性始终为 null 或默认值 而不是传入的值 如果我使用 REST 客户端调用相同的方法 我使
  • 阻止 Google Chrome 发送 Sec-Fetch 标头

    我想在我的 Web API 2 net framework 4 6 2 应用程序 中缓存静态内容 index html 我编写了 OWIN 中间件 添加了一个cache control响应的标头 允许从浏览器缓存中检索后续请求 OWIN 上
  • ASP.NET Web API Swagger(Swashbuckle)重复OperationId

    I have a web api controller like below In swagger output I am having the below image And when I want to consume it in my
  • HttpResponseMessage 的内容为 JSON

    我有一个 ASP NET MVC WEB API 由于多种原因 由于没有授权而重定向 我不能只使用一个简单的对象并在我的控制器方法中返回它 因此我需要 HttpResponseMessage 类来允许我重定向 目前我正在这样做 var re
  • Windows Phone HttpClient PostAsync 挂起且无响应

    我在拨打电话时遇到问题HttpClientWP 应用程序的 post 方法 PostAsync总是挂起并且不给出任何响应 当我从 WPF 应用程序中尝试时 相同的代码可以工作 这是我正在做的事情 服务器Web API代码 public cl
  • Web Api 请求在 IIS 上永远排队(状态:ExecuteRequestHandler)

    我目前在生产环境中遇到一些挂起 经过一番调查后 我发现大量请求在应用程序池的工作进程中排队 常见的事情是 每个长时间排队的请求都是一个Web api请求 我同时使用MVC and Web API在应用程序中 请求排队时间约为 3 小时 当应
  • 在 OData 中插入具有所需外键的实体

    EDIT 2 经过几个小时的研究 谷歌上几乎所有与 odata 相关的链接都变成了紫色 我发现 深度插入 的概念 link http docs oasis open org odata odata v4 0 cs01 part1 proto
  • 开放泛型类型上的 StructureMap GetAllInstances

    我是 StructureMap 新手 正在尝试一个简单的场景 我扫描基本文件夹中的所有程序集 并查找实现我的开放通用接口的类型 Scan scan gt scan AssembliesFromApplicationBaseDirectory

随机推荐