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
C# 如何将IHttpRouteConstraint注入web api?_C#_.net_Asp.net Web Api_Dependency Injection_Simple Injector - Fatal编程技术网

C# 如何将IHttpRouteConstraint注入web api?

C# 如何将IHttpRouteConstraint注入web api?,c#,.net,asp.net-web-api,dependency-injection,simple-injector,C#,.net,Asp.net Web Api,Dependency Injection,Simple Injector,正如标题所述,我需要能够将服务注入到web api约束类中。我在我的c#webApi项目中使用SimpleInjector 在我的webApiConfig.cs中,我有这个 // add constraint resolvers var constraintResolver = new DefaultInlineConstraintResolver(); constraintResolver.ConstraintMap.Add("dynamicName", typeof(DynamicRoute

正如标题所述,我需要能够将服务注入到web api约束类中。我在我的c#webApi项目中使用SimpleInjector

在我的webApiConfig.cs中,我有这个

// add constraint resolvers
var constraintResolver = new DefaultInlineConstraintResolver();
constraintResolver.ConstraintMap.Add("dynamicName", typeof(DynamicRouteConstraint));

// routing
config.MapHttpAttributeRoutes(constraintResolver);
我的订制合同是这样的

public class DynamicRouteConstraint : IHttpRouteConstraint
{
    private IDynamicRouteService _service;

    public DynamicRouteConstraint(IDynamicRouteService service)
    {
        _service = service;
    }

    public bool Match(System.Net.Http.HttpRequestMessage request, IHttpRoute route, string parameterName, IDictionary<string, object> values, HttpRouteDirection routeDirection)
    {
        return _service.Match(values[parameterName].ToString());
    }
}
更新:

所以我查看了类的实现,发现这个类没有使用容器解析器,而是使用激活器类来创建实例,这可能会导致默认构造函数实例的问题


在我看来,您可能需要为IInlineConstraintResolver创建一个自定义实现,或者从DynamicRouteConstraint构造函数中删除参数IDynamicRouteService,并通过其他方式初始化实例

你用的是软件包,对吗?如果我猜对了,请检查我的答案。您使用的是SimpleInjector,但SimpleInjector的WebAPI集成包附带了另一个关联库,它提供了WebAPI兼容的container.edited问题,包括startup.cs和SimpleInjector.register函数,从而实现了所需的功能我想我已经解决了,引发此异常的不是简单的注入器,而是DefaultInlineConstraintResolver类。看我的回答。
container.RegisterWebApiRequest<IDynamicRouteService, DynamicRouteService>();
public class DynamicRouteService : IDynamicRouteService
{
    private IModuleService _service;

    public DynamicRouteService(IModuleService service)
    {
        _service = service;
    }

    public ICollection<DynamicRouteModel> GetRoutes()
    {
        var list = new List<DynamicRouteModel>();

        // custom code usually here

        return list;
    }

    public void Clear()
    {
        // custom code usually here
    }

    public bool Match(string name)
    {
        // custom code usually here
        return false;
    }

}
public static Container Register(HttpConfiguration apiConfig)
{
    var container = new Container();

    container.RegisterPerWebRequest<HttpContextBase>(() => new HttpContextWrapper(HttpContext.Current));
    container.RegisterPerWebRequest<HttpConfiguration>(() => apiConfig);

    // EnableHttpRequest and IDynamicNameService are needed to get the name of the module
    // that is requested via the DynamicDataController
    container.EnableHttpRequestMessageTracking(apiConfig);
    container.RegisterWebApiRequest<IDynamicModuleService, DynamicRouteService>();

    // service for dynamicRoute checking
    container.Register<IDynamicRouteService, DynamicRouteService>();

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

    container.RegisterMvcControllers(Assembly.GetExecutingAssembly());

    container.Verify();

    DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));

    apiConfig.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);

    return container;
}
public void Configuration(IAppBuilder app)
{
    // This is a self hosted webapi project..
    HttpConfiguration apiConfig = new HttpConfiguration();

    // confgi oauth
    OAuthConfig.Register(app);

    // simple injector
    var container = SimpleInjectorConfig.Register(apiConfig);

    AutoMapperConfig.RegisterMappings();
    AreaRegistration.RegisterAllAreas();
    WebApiConfig.Register(apiConfig, container);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

    app.UseWebApi(apiConfig);
}