웹 API 프로젝트에서 현재 요청이 필요한 종속성이 있습니다.간단한 인젝터 - 생성자 현재 웹 API 요청의 HttpRequestMessage를 삽입하십시오.
코드는 아래와 같다 :
public interface IResourceLinker {
Uri Link(string routeName, object routeValues);
}
public class ResourceLinker : IResourceLinker {
private readonly HttpRequestMessage _request;
public ResourceLinker(HttpRequestMessage request) {
_request = request;
}
public Uri Link(string routeName, object routeValues) {
return new Uri(_request.GetUrlHelper()
.Link(routeName, routeValues));
}
}
public class TestController : ApiController {
private IResourceLinker _resourceLinker;
public TestController(IResourceLinker resourceLinker) {
_resourceLinker = resourceLinker
}
public Test Get() {
var url = _resourceLinker.Link("routeName", routeValues);
// etc.
}
}
가 런타임시 용기에 현재 요청을 주입 할 수 있고, 간단한 인젝터 사용?
나는 다음과 같은 시도 :public class InjectRequestHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
InjectRequest(request);
return base.SendAsync(request, cancellationToken);
}
public static void InjectCurrentRequestIntoContainer(
HttpRequestMessage request)
{
var resolver = (SimpleInjectorDependencyResolver)
request.GetDependencyScope();
resolver.Container.Register(() => request);
}
}
을하지만
컨테이너가하는 GetInstance, GetAllInstances에 대한 첫 번째 호출 후 변경 및 확인 할 수없는 다음과 같은 오류를 받았다.
현재 요청을 런타임에 컨테이너에 삽입 할 수있는 방법이 있습니까?
HttpRequestMessage에서 확장 메소드로 링크 메소드를 정의하고'TestController'에서'this.Request.Link (...) '를 호출하지 않는 이유는 무엇입니까? 그렇지 않으면'HttpRequestMessage'가 런타임 값이기 때문에 생성자 삽입을 사용하는 대신'Link' 메쏘드에 메소드 인자로 넘겨 주어야합니다. – Steven
스티븐, 귀하의 의견에 감사드립니다. simpleinjector의 작성자로서 런타임 등록이 가능합니까? –
컨테이너에서 첫 번째 인스턴스를 확인한 후에는 새 등록을 추가 할 수 없습니다. 그러나 컨테이너 인 경우에도 HttpRequestMessage를 컨테이너에 등록하면 경쟁 조건이 발생하지만 컨테이너는 전역이지만 요청 당 하나의 메시지가 필요합니다. – Steven