gpt4 book ai didi

c# - Web API Controller 的构造函数是如何调用的?

转载 作者:可可西里 更新时间:2023-11-01 08:04:06 25 4
gpt4 key购买 nike

根据 this article , Controller 应该有一个构造函数来获取传入的要实现的接口(interface),a la:

public class DuckbillsController : ApiController
{
IDuckbillRepository _platypiRepository;

public DuckbillsController(IDuckbillRepository platypiRepository)
{
if (platypiRepository == null)
{
throw new ArgumentNullException("platypiRepository is null");
}
_platypiRepository = platypiRepository;
}
}

但是这个构造器是怎么调用的呢?通过客户端调用此类中包含的 Web API 方法进行计算,但它如何传递接口(interface)类型?还是不必发生(构造函数未被任何人/从任何地方显式调用)?

更新

规范示例显示在接口(interface)声明前面加上“private readonly”,但这不是编译所必需的。是否有编译,我的意思是令人信服的理由,让我在前面加上“私有(private)只读”?

最佳答案

因为在任何地方都没有这方面的文档(官方文档只是讨论如何使用 Unity)。这是你如何做的。

HttpConfiguration.DependencyResolver 属性是 IDependecyResolver 的一个实例,它基本上是一个服务定位器(您需要一个类型的实例,它知道如何创建它) .我想要的是提供我自己的 Controller 实例化。

像这样使用:

config.DependencyResolver = 
new OverriddenWebApiDependencyResolver(config.DependencyResolver)
.Add(typeof(ScoreboardController), () =>
new ScoreboardController(Messages)
);

这样实现:

/// <summary>
/// The standard web api dependency resolver cannot inject dependencies into a controller
/// use this as a simple makeshift IoC
/// </summary>
public class OverriddenWebApiDependencyResolver : WebApiOverrideDependency<IDependencyResolver >, IDependencyResolver {
public OverriddenWebApiDependencyResolver Add(Type serviceType, Func<object> initializer) {
provided.Add(serviceType, initializer);
return this;
}
public IDependencyScope BeginScope() => new Scope(inner.BeginScope(), provided);
public OverriddenWebApiDependencyResolver(IDependencyResolver inner) : base(inner, new Dictionary<Type, Func<object>>()) { }
public class Scope : WebApiOverrideDependency<IDependencyScope>, IDependencyScope {
public Scope(IDependencyScope inner, IDictionary<Type, Func<object>> provided) : base(inner, provided) { }
}
}
public abstract class WebApiOverrideDependency<T> : IDependencyScope where T : IDependencyScope {
public void Dispose() => inner.Dispose();
public Object GetService(Type serviceType) {
Func<Object> res;
return provided.TryGetValue(serviceType, out res) ? res() : inner.GetService(serviceType);
}

public IEnumerable<Object> GetServices(Type serviceType) {
Func<Object> res;
return inner.GetServices(serviceType).Concat(provided.TryGetValue(serviceType, out res) ? new[] { res()} : Enumerable.Empty<object>());
}
protected readonly T inner;
protected readonly IDictionary<Type, Func<object>> provided;
public WebApiOverrideDependency(T inner, IDictionary<Type, Func<object>> provided) {
this.inner = inner;
this.provided = provided;
}

}

诀窍在于您实际上必须实现 IDependencyScope 两次 - 一次用于 IDependencyResolver ,一次用于它在每个请求上创建的范围。

关于c# - Web API Controller 的构造函数是如何调用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20752485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com