Я прочитал следующую статью .NET Junkie - Между тем ... на стороне команд моей архитектуры, предложенной другим пользователем stackoverflow, который описывает шаблон команды и предоставляет стратегию использования его с DI в конце статьи.
Это очень помогло, но единственное, чего мне не хватает, - скажем, я создаю новый класс с именем CheckoutCustomerCommandHandler
.
Теперь предположим, что мне нужно ввести эту команду и MoveCustomerCommandHandler
в контроллер по какой-либо причине через конструктор. Как это повлияет на настройку контейнера DI и конструктор?
По сути, они оба реализуют один и тот же интерфейс. Похоже, это приведет к проблеме поиска контейнера DI. В примере статьи, вот их образец настройки инжектора:
public interface ICommandHandler<TCommand>
{
void Handle(TCommand command);
}
// Exactly the same as before, but now with the interface.
public class MoveCustomerCommandHandler
: ICommandHandler<MoveCustomerCommand>
{
private readonly UnitOfWork db;
public MoveCustomerCommandHandler(UnitOfWork db,
[Other dependencies here])
{
this.db = db;
}
public void Handle(MoveCustomerCommand command)
{
// TODO: Logic here
}
}
// Again, same implementation as before, but now we depend
// upon the ICommandHandler abstraction.
public class CustomerController : Controller
{
private ICommandHandler<MoveCustomerCommand> handler;
public CustomerController(
ICommandHandler<MoveCustomerCommand> handler)
{
this.handler = handler;
}
public void MoveCustomer(int customerId,
Address newAddress)
{
var command = new MoveCustomerCommand
{
CustomerId = customerId,
NewAddress = newAddress
};
this.handler.Handle(command);
}
}
using SimpleInjector;
using SimpleInjector.Extensions;
var container = new Container();
// Go look in all assemblies and register all implementations
// of ICommandHandler<T> by their closed interface:
container.RegisterManyForOpenGeneric(
typeof(ICommandHandler<>),
AppDomain.CurrentDomain.GetAssemblies());
// Decorate each returned ICommandHandler<T> object with
// a TransactionCommandHandlerDecorator<T>.
container.RegisterDecorator(typeof(ICommandHandler<>),
typeof(TransactionCommandHandlerDecorator<>));
// Decorate each returned ICommandHandler<T> object with
// a DeadlockRetryCommandHandlerDecorator<T>.
container.RegisterDecorator(typeof(ICommandHandler<>),
typeof(DeadlockRetryCommandHandlerDecorator<>));
SimpleInjector
. Я могу сказать вам, что другие контейнеры DI, такие как Ninject и Autofac, поддерживают этот сценарий. - person neontapir   schedule 01.11.2012