我的控制器类有一个依赖项,例如:
public class UserController : ControllerBase {
public UserController(IMediator mediator) => _mediator = mediator;
private readonly IMediator _mediator;
}
但这必须在我所有的控制器中重复。我更喜欢进行属性注入,所以我可以像这样清理它:
public abstract class MyControllerBase : ControllerBase {
public IMediator Mediator { get; init; } // use init so container resolves this and cannot be changed later
}
public class UserController : MyControllerBase {
}
为了让它发挥作用,我遵循了 docs。
我改变了我的Startup.ConfigureServices()
:
services.AddControllers().AddControllersAsServices();
我在以下位置注册了控制器Startup.ConfigureContainer(ContainerBuilder builder)
:
builder
.RegisterAssemblyTypes(typeof(Startup).Assembly)
.AssignableTo<MyControllerBase>()
.InstancePerLifetimeScope()
.PropertiesAutowired();
这样可行。
但是文档说我可以注入一个特定的属性:
如果你有一个特定的属性和值要连接,你可以使用 WithProperty() 修饰符:
builder.RegisterType<A>().WithProperty("PropertyName", propertyValue);
所以我必须更改我的代码:
var types =
typeof(Startup).Assembly
.GetExportedTypes()
.Where(type => typeof(MyControllerBase).IsAssignableFrom(type))
.ToArray();
foreach (var type in types)
builder.RegisterType(type).WithProperty(nameof(MyControllerBase.Mediator), propertyValue);
如何propertyValue
从容器中动态解析。并且,容器会在控制器类中注入任何其他属性,还是只注入那个?