我有以下注册(请注意,我没有完成此代码,所以它甚至可能无法按预期工作):
builder.RegisterType<SimpleInMemoryChannel>()
.Named<IChannel>("ErrorChannel")
.WithParameter(new NamedParameter("channelName", "ErrorChannel"));
builder.RegisterType<SimpleInMemoryChannel>()
.Named<IChannel>("RequestCbrInput")
.WithParameter(new NamedParameter("channelName", "RequestCbrInput"));
// Constructor: public SimpleInMemoryChannel(string channelName)
如您所见,我正在尝试使用注册对象的名称作为channelName值。代码有点冗长。我有什么方法可以自动完成任务吗?例如我想写一下:
builder.RegisterType<SimpleInMemoryChannel>()
.Named<IChannel>("ErrorChannel");
builder.RegisterType<SimpleInMemoryChannel>()
.Named<IChannel>("RequestCbrInput");
并自动设置channelName。
答案 0 :(得分:1)
默认功能中没有任何内容可以允许这种情况发生。您需要自定义注册,或使用工厂解决。最简单的解决方案是您在评论中提到的解决方案 - 添加辅助函数来注册频道 - 这样您仍然可以使用默认的解析过程。
答案 1 :(得分:0)
使用RegisterChannel
方法可能是更优雅的解决方案。
顺便说一下,如果你不能有这样的方法,你可以使用自定义模块:
public class NamedParameterModule<TServiceType> : Module
{
private readonly string _parameterName;
public NamedParameterModule(String parameterName)
{
this._parameterName = parameterName;
}
protected override void AttachToComponentRegistration(
IComponentRegistry componentRegistry, IComponentRegistration registration)
{
KeyedService keyedService = registration.Services
.OfType<KeyedService>()
.FirstOrDefault(ks => ks.ServiceType == typeof(TServiceType));
if (keyedService != null)
{
registration.Preparing += (sender, e) =>
{
e.Parameters = e.Parameters.Concat(new Parameter[] {
new NamedParameter(this._parameterName, keyedService.ServiceKey)
});
};
}
base.AttachToComponentRegistration(componentRegistry, registration);
}
}
使用builder.RegisterModule(new NamedParameterModule<IFoo>("channelName"));
这个实例的dotnetfiddle:https://dotnetfiddle.net/MPfMup。