Вот мой сценарий:Windsor регистрация для общих команд/обработчиков команд
public static class DomainCommandProcessor
{
public static void Dispatch<T>(T command) where T : IDomainCommand
{
var serviceLocator = ServiceLocator.Current;
var handler = serviceLocator.GetInstance<IDomainCommandHandler<T>>();
if (handler != null)
handler.Handle(command);
}
}
public class FakeGenericCommand<T1, T2> : IDomainCommand
{
public FakeGenericCommand(T1 first, T2 second)
{
First = first;
Second = second;
}
public T1 First { get; private set; }
public T2 Second { get; private set; }
}
public class FakeGenericCommandHandler<T1, T2> : IDomainCommandHandler<FakeGenericCommand<T1, T2>>
{
public void Handle(FakeGenericCommand<T1, T2> command)
{
// something interesting
}
}
Использование:
DomainCommandProcessor.Dispatch(new FakeGenericCommand<string, string>("hi", "there"))
Я не могу получить регистрацию права Виндзор. Следующее прекрасно работает для всех моих необщих команд:
container.Register(Classes.FromAssemblyNamed(namespaceName)
.BasedOn(typeof(IDomainCommandHandler<>))
.WithService.AllInterfaces()
.LifestyleTransient());
Если зарегистрировать каждую возможную реализацию непосредственно, она работает, но, очевидно, неоптимальные:
container.Register(
Component.For<IDomainCommandHandler<FakeGenericCommand<string, string>>>()
.UsingFactoryMethod(input => new FakeGenericCommandHandler<string, string>())
.LifestyleTransient());
Предложение?
Поскольку вы используете библиотеку DI, существует ли какая-либо веская причина для того, чтобы вы прибегли к сервису Location вместо использования Injection Dependency? В чем преимущество использования этого статического «DomainCommandProcessor» над «IDomainCommandProcessor», который вы вводите в компоненты, которые в нем нуждаются? – Steven