2015-10-08 21 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>());