Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
StructureMap和ASP.Net Web API以及.Net Framework 4.5_.net_Dependency Injection_Ioc Container_Asp.net Web Api_Structuremap - Fatal编程技术网

StructureMap和ASP.Net Web API以及.Net Framework 4.5

StructureMap和ASP.Net Web API以及.Net Framework 4.5,.net,dependency-injection,ioc-container,asp.net-web-api,structuremap,.net,Dependency Injection,Ioc Container,Asp.net Web Api,Structuremap,StructureMap的当前版本是否支持ASP.Net Web API、MVC 4和.Net Framework 4.5?如上所述,Web API使用依赖项解析程序 class StructureMapDependencyResolver : IDependencyResolver { public IDependencyScope BeginScope() { return this; } public object GetService(

StructureMap的当前版本是否支持ASP.Net Web API、MVC 4和.Net Framework 4.5?

如上所述,Web API使用依赖项解析程序

class StructureMapDependencyResolver : IDependencyResolver
{
    public IDependencyScope BeginScope()
    {
        return this; 
    }

    public object GetService(Type serviceType)
    {
        return ObjectFactory.GetInstance(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return ObjectFactory.GetInstances(serviceType);
    }

    public void Dispose()
    {
    }
}
除此之外,新的Web API非常容易与IoC容器一起使用

我还没有研究它,但我相信我留白的
BeginScope
方法可以用于子容器

编辑:

上述实施效果良好;事实上,我更喜欢它,而不是我将要告诉你的其他选择。这一个将尽StructureMap的最大能力解析任何类型,并在出现问题时抛出错误。我喜欢看到错误,因为它们告诉我我做错了什么

但是,如果出现问题,API预计
GetService
将返回null。因此,为了符合API,建议采用以下实施方式:

public object GetService(Type serviceType)
{
    if (serviceType.IsAbstract || serviceType.IsInterface)
        return ObjectFactory.TryGetInstance(serviceType);
    else 
        return ObjectFactory.GetInstance(serviceType);
}

区别在于
TryGetInstance
只查找容器中注册的类型,如果出现问题,将返回null
serviceType.IsAbstract | | serviceType.IsInterface
被认为是决定使用哪种方法的足够好的检查。我最初的回答是直截了当和简单的,但@PHeiberg在这里的评论中指出,它并不完全“正确”。既然您已经掌握了相关知识,请使用看起来最好的工具。

ASP.NET Web API发行版使用了依赖项解析器(接口的实现),并引入了新概念-依赖项范围(接口的实现)。正确地实现IDependencyScope很重要-如果实现正确,它允许在释放IDependencyScope时释放资源(在范围中创建)。并在请求结束时进行处理

当容器支持嵌套(或子)容器时,IDependencyScope工作得最好。StructureMap从版本2.6.1开始执行此操作

我写了一篇关于如何在Web API中配置StructureMap的文章:

您还可以查看Mike Wasson的文章:

StructureMap无法处理此处预期的依赖项解析。看看这个例子和Jeremy的评论:事实上这是可行的。Jeremy说,
TryGetInstance
只有在明确注册了
serviceType
时才能解决
GetInstance
仍将解析未注册但具体的类型。实例的解析将与您的代码一起工作。然而,我将我发布的链接解释为建议的“最佳实践”,因为Jeremy本人就是这样。我猜GetService方法应该返回null,而不是在容器无法解析类型时生成异常。我发现了一篇博客文章,其中包含了更多步骤:一个小修改(除非API在v5中发生了更改,否则我使用的是v4),您的StructureMappDependencyResolver缺少一个“IDependencyScope”声明
public object GetService(Type serviceType)
{
    if (serviceType.IsAbstract || serviceType.IsInterface)
        return ObjectFactory.TryGetInstance(serviceType);
    else 
        return ObjectFactory.GetInstance(serviceType);
}