Может ли класс с начальным параметром использовать шаблон Inversion of Control (Io C)? - PullRequest
0 голосов
/ 27 апреля 2020

Мне интересно, может ли класс с начальным параметром использовать шаблон Inversion of Control (Io C)?

Пример:

Страница с кнопкой поиска может искать порядок детализация по экземпляру класса.

class:

    public class OrderDetail
    {
        order order ;
        public OrderDetail(string orderID)
        {
            order = DumbOrderList().where(o=>o.orderID == OrderID);
        }
        public decimal GetPrice()
        {
            retrun order.Price;
        }
        public datetime GetDate()
        {
            retrun order.Date;
        }
        ...
        ...
        ...
    }

Страница:

[HttpPost]
public IActionResult Search(string orderID)
{
    OrderDetail orderHelper = new OrderDetail(orderID);

    return Json(orderHelper.GetPrice());
}

Страница зависит от OrderDetail Class, и каждый поиск будет создавать экземпляр класса с orderID.

Как сделать OrderDetail Класс с использованием шаблона Io C?

Или если он не может использовать шаблон Io C, так как я могу сделать страницу не зависящей от этого класса (развязка)?

Ответы [ 2 ]

1 голос
/ 27 апреля 2020

На самом деле способ, которым вы разработали свой класс, может быть улучшен. Вместо того, чтобы сделать ваш класс зависимым от какого-либо параметра для создания экземпляра, сделайте методы этого класса зависимыми.

Я хочу сказать, перепроектируйте класс OrderDetail, как показано ниже:

1.) Создайте интерфейс

public interface IOrderDetail 
{
    GetPrice(int orderId)
}

2.) Создайте класс, реализующий интерфейс

public class OrderDetail : IOrderDetail
{
    public GetPrice(int orderId) {....}
}

3.) Зарегистрируйте зависимость в контейнере Io C

container.RegisterType<IOrderDetail, OrderDetail>();

4. ) Используйте его, как показано ниже в API Controller

public class SomeController : ApiController 
{

    private readonly IOrderDetail _orderDetail;

    public SomeController(IOrderDetail orderDetail) 
    {
        _orderDetail = orderDetail;
    }

    [HttpPost]
    public IActionResult Search(string orderID)
    {
        return Json(_orderDetail.GetPrice(orderID));
    }

}
0 голосов
/ 27 апреля 2020

При инверсии шаблона управления вам необходимо определить интерфейс, которому Search может делегировать свое поведение. Определение интерфейса может быть субъективным, и поэтому здесь нет единственного ответа.

Если бы я был человеком, осуществляющим инверсию управления в соответствии с приведенным примером, я бы сделал:

interface IOrderPriceGetter
{ 
    decimal GetByOrderId(int orderId);
}

class OrderPriceGetter : IOrderPriceGetter
{
    public decimal GetByOrderId(int orderId)
    {
        return new OrderDetail(orderId).GetPrice();
    }
}

[HttpPost]
public IActionResult Search(string orderID)
{
    // Injected via constructor
    IOrderPriceGetter getter = ...;

    return Json(getter.GetByOrderId(orderId));
}

Или я мог бы также определить интерфейс как:

interface IOrderGetter
{ 
    OrderDetail GetOrder(int orderId);
}

Затем использовать его как:

[HttpPost]
public IActionResult Search(string orderID)
{
    // Injected via constructor
    IOrderGetter getter = ...;

    return Json(getter.GetOrder(orderId).GetPrice());
}
...