如何使用IOC实现以下目标?

时间:2015-10-08 01:22:52

标签: inversion-of-control unity-container castle-windsor

我想在我的服务中使用IOC,我想在服务层中注入一个类而不是构造函数中的接口,但我 想要从调用层创建一个新对象,如var service = new InvoiceService(new ChangeInvoiceDueDateCommand())而不是我想从MVC中的控制器创建这样的东西,其中IInvoiceService被注入控制器构造函数,但我看到的问题是

  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; }
    }

1 个答案:

答案 0 :(得分:1)

我解决了这个问题。这只是一个Windsor语法问题。它最终就像使用container.Register(Component.For<ChangeInvoiceDueDateCommand>());

注册命令一样简单