首页 > 解决方案 > 具有初始参数的类可以使用控制反转模式(IoC)吗?

问题描述

我很好奇具有初始参数的类可以使用控制反转模式(IoC)吗?

例子 :

带有搜索按钮的页面可以通过类助手实例化搜索订单详细信息。

班级 :

    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类,每次搜索都会用orderID.

如何OrderDetail使用 IoC 模式制作类?

或者如果它不能使用 IoC 模式,那么我怎样才能使页面不依赖于这个类(解耦)?

标签: c#asp.net-mvcasp.net-coreinversion-of-controlioc-container

解决方案


实际上,您设计课程的方式可以改进。不要让你的类依赖于某个参数来实例化,而是让那个类的方法依赖。

我的意思是说,重新设计 OrderDetail 类,如下所示:

1.) 创建一个界面

public interface IOrderDetail 
{
    GetPrice(int orderId)
}

2.) 创建一个实现接口的类

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

3.) 在 IoC 容器中注册依赖

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

}

推荐阅读