【问题标题】:How can I achieve the following using IOC?如何使用 IOC 实现以下目标?
【发布时间】:2015-10-08 15:00:03
【问题描述】:

我想在我的服务中使用 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);
    }

请求

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

【问题讨论】:

  • 你的问题是什么?

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


【解决方案1】:

我解决了。这只是温莎语法问题。它最终就像使用 container.Register(Component.For&lt;ChangeInvoiceDueDateCommand&gt;()); 注册命令一样简单

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-14
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多