【发布时间】:2015-09-13 22:14:25
【问题描述】:
除了解析接口之外,我希望能够使用 Unity Container 来包装所有实现公共父接口的实例。例如,假设您为命令定义了公共接口以及处理它们的类的实现:
public interface ICommand {}
public interface ICommandHandler<T> where T : ICommand
{
void Execute(T command);
}
然后你有一些实现这些接口的类:
public class MoveCommand : ICommand { /* properties */ }
public class MoveHandler : ICommandHandler<MoveCommand>
{
public void Execute(MoveCommand command) { /* do stuff */ }
}
public class CreateCommand : ICommand { /* properties */ }
public class CreateHandler : ICommandHandler<CreateCommand>
{
public void Execute(CreateCommand command) { /* do other stuff */ }
}
这些命令随后会在 Unity Container 中注册:
container.RegisterType<ICommandHandler<MoveCommand>, MoveHandler>(new ContainerControlledLifetimeManager());
container.RegisterType<ICommandHandler<CreateCommand>, CreateHandler>(new ContainerControlledLifetimeManager());
现在,假设您有一些用于实现横切关注点的接口:
public interface ILogger<T> : ICommandHandler<T> where T : ICommand { }
public class Logger<T> : ILogger<T> where T : ICommand
{
private ICommandHandler<T> handler;
public Logger(ICommandHandler<T> handler)
{
this.handler = handler;
}
public void Execute(T command)
{
// Log stuff
handler.Execute(command);
}
}
像这样在 Unity 中注册:
container.RegisterType(typeof(ILogger<>), typeof(Logger<>), new ContainerControlledLifetimeManager());
我希望 Unity 在解决它时能够将每个 ICommandHandler 包装在 ILogger 中。一种方法是修改每个 ICommandHandler 类型的 RegisterType 调用。但是,本着“不要重复自己”的精神,我真的希望能够指定一次 all ICommandHandler 类型应该另外包装在适当类型的 ILogger 中。可能会注册大量 ICommandHandler 类型,以及用于错误处理、身份验证等内容的附加包装器,因此重复和疏忽的机会会很大。有没有办法一次将包装器应用于所有这些?
编辑:这是我正在寻找的语法,改编自接受的答案和接受的答案中的第一个链接:
container.RegisterType<ICommandHandler<MoveCommand>, MoveHandler>("InnerCommand", new ContainerControlledLifetimeManager());
container.RegisterType<ICommandHandler<CreateCommand>, CreateHandler>("InnerCommand", new ContainerControlledLifetimeManager());
container.RegisterType(typeof(ICommandHandler<>),
typeof(Logger<>),
InjectionConstructor(new ResolvedParameter(typeof(ICommandHandler<>), "InnerCommand")));
【问题讨论】:
-
听起来你想做面向方面的编程。看看 PostSharp postsharp.net
标签: c# .net dependency-injection unity-container