2015-10-08 23 views
1

我想用国际奥委会与我的服务,我想,而不是注入类未在服务层下面的构造函数的接口,但我希望从像var service = new InvoiceService(new ChangeInvoiceDueDateCommand())调用层创建新对象相反,我想从我的MVC控制器在IInvoiceService注入控制器构造函数创建这样的事情,但我看到的问题是,如何使用IOC实现以下功能?

public InvoiceController(IInvoiceService invoiceService, IMapper mapper) 
      { 
       _invoiceService = invoiceService; 
       _mapper = mapper; 
      } 

,然后这样调用

public ActionResult ChangeInvoiceDueDate(InvoiceChangeDueDateViewModel invoiceChangeDueDateViewModel) 
      { 
       var request = _mapper.Map<InvoiceChangeDueDateViewModel, ChangeInvoiceDuedateRequest>(invoiceChangeDueDateViewModel); 
       InvoiceChangeDueDateResponse response = _invoiceService.ChangeDueDate(request); 

       return View(); 
      } 

服务层

public class InvoiceService : IInvoiceService 
    { 
     private readonly ChangeInvoiceDueDateCommand _changeInvoiceDueDateCommand; 

     public InvoiceService(ChangeInvoiceDueDateCommand changeInvoiceDueDateCommand) 
     { 
      _changeInvoiceDueDateCommand = changeInvoiceDueDateCommand; 
     } 

     public InvoiceChangeDueDateResponse ChangeDueDate(ChangeInvoiceDuedateRequest invoiceChangeDueDateRequest) 
     { 
      _changeInvoiceDueDateCommand.Execute(invoiceChangeDueDateRequest); 
      return new InvoiceChangeDueDateResponse {Status = new Status()}; 
     } 
    } 

命令

public class ChangeInvoiceDueDateCommand : ICommand<ChangeInvoiceDuedateRequest> 
    { 
     private readonly IRepository<Invoice> _invoiceRepository; 

     readonly InvoiceDueDateChangeValidator _validator; 

     public ChangeInvoiceDueDateCommand(IRepository<Invoice> invoiceRepository) 
     { 
      _invoiceRepository = invoiceRepository; 
      _validator = new InvoiceDueDateChangeValidator(); 
     } 


     public void Execute(ChangeInvoiceDuedateRequest request) 
     { 
      if (_validator.IsDuedateValid(request.NewDuedate)) 
      { 
       Invoice invoice = _invoiceRepository.GetById(request.Id); 
       invoice.ChangedDueDate(request.NewDuedate); 
       _invoiceRepository.SaveOrUpdate(invoice); 

      } 
      else 
      { 
       throw new InvalidDueDateException(); 
      } 
     } 
    } 

的ICommand

public interface ICommand<T> where T : IRequest 
    { 
     void Execute(T request); 
    } 

IRequest

public interface IRequest 
    { 
     int Id { get; set; } 
    } 
+0

注册命令一样简单您的问题是什么? –

回答

1

我的工作了。这只是一个温莎语法问题。它最终就像使用container.Register(Component.For<ChangeInvoiceDueDateCommand>());