我有一个开放的泛型类型AccessMessageHandler<TProcess>
,每次解析后都想IProcessHandler<AccessMessage<TProcess>>
解析。我怎样才能做到这一点?
这是我的代码:
public interface IProcess {}
public interface IProcessHandler<in TProcess> where TProcess : IProcess {
void Handle(TProcess message);
}
public class AccessMessage<TProcess> : IProcess where TProcess : IProcess {
public virtual string Username {get;protected set;}
public virtual TProcess InnerProcess { get; protected set; }
}
public class AccessMessageHandler<TProcess> : IProcessHandler<AccessMessage<TProcess>>
where TProcess : IProcess {
public AccessMessageHandler(IProcessHandler<TProcess> innerHandler){}
public void Handle(AccessMessage<TProcess> message){
// access control
_innerHandler.Handle(message.InnerProcess)
}
}
public class JustDoIt : IProcess {
public virtual string What {get;set;}
}
public class JustDoItHandler : IProcessHandler<JustDoIt> {
public void Handle(JustDoIt message) {
// handle
}
}
我该如何注册IProcessHandler,AccessMessageHandler for Simple Injector解析如下:
var accessMessageProcess = new AccessMessage<JustDoIt>()
{
Username = "user",
InnerProcess = new JustDoIt() { What="xxx" }
};
var handler = GetHandlerFor(accessMessageProcess);
// must return AccessMessageHandler<JustDoIt>(JustDoItHandler)
handler.Handle(accessMessageProcess);
您可以进行以下注册:
container.RegisterManyForOpenGeneric(
typeof(IProcessHandler<>),
typeof(JustDoItHandler).Assembly);
container.RegisterOpenGeneric(
typeof(IProcessHandler<>),
typeof(AccessMessageHandler<>));
调用RegisterManyForOpenGeneric
将搜索的程序集,JustDoItHandler
并查找的所有公共具体(非通用)实现IProcessHandler<TProcess>
。最后,这与对手动进行一堆调用相同container.Register<IProcessHandler<SomeProcess>, SomeProcessHandler>()
。
的调用RegisterOpenGeneric
将开放通用抽象映射到开放通用类型。它在后台使用未注册的类型解析,因此每次IProcessHandler<TProcess>
请求未显式注册(RegisterManyForOpenGeneric
例如,使用)的a时,AccessMessageHandler<TProcess>
都会解析an (如果通用类型约束匹配)。
以下代码可用于解析对象图并执行处理程序:
var handler = container.GetInstance<IProcessHandler<AccessMessage<JustDoIt>>>();
handler.Handle(accessMessageProcess);
这应该可以解决以下图形:
IProcessHandler<AccessMessage<JustDoIt>> handler =
new AccessMessageHandler<JustDoIt>(
new JustDoItHandler());
确实注意到,虽然该AccessMessageHandler<TProcess>
是不是一个装饰。装饰器包装与实现相同的类型,但是您的AccessMessageHandler<TProcess>
实现IProcessHandler<AccessMessage<TProcess>>
却包装IProcessHandler<TProcess>
。我认为这种模式的正确名称是代理。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句