Dependency Injection ใน .NET Core

ของเดิม แบบที่เป็น Tight Coupled Dependencies แบบนี้

namespace RestServer.Controllers
{
    [Route("api/[controller]")]
    public class CustomersController : Controller
    {
        private CustomersService svc;

        public CustomersController() {
            this.svc = new CustomersService();
        }
    }
}

เวลา Test มันยาก ตอนจะ mock ตัว CustomersService ให้เปลี่ยนมาใช้ Dependency Injection แทน

วิธีการทำ ให้ทำแบบนี้

namespace RestServer.Controllers
{
    [Route("api/[controller]")]
    public class CustomersController : Controller
    {
        private ICustomersService svc;

        public CustomersController(ICustomersService cs) {
            this.svc = cs;
        }
    }
}

สิ่งที่จะต้องทำเพิ่มตรงนี้คือ ทำ Interface Class ให้กับ CustomersService Class ตั้งชื่อเป็น ICustomersService

using RestServer.Models;

namespace RestServer.Services
{
  public interface ICustomersService
  {
      Customer[] All ();
      Customer Get (int id);
      bool Exists (int id);
      void Update (int id, Customer cust);
      void Add (Customer cust);
      void Remove(int id);
      int NextId ();
  }
}

หลังจากนั้นให้ไปบอก CustomersService Class ว่า implements จาก ICustomersService

namespace RestServer.Services {
    public class CustomersService : ICustomersService {
    // ...
    }
}

เสร็จแล้วให้ไป register ใน Startup.cs ใน method ConfigureServices()

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();
    // Add application services.
    services.AddTransient<ICustomersService, CustomersService>();
}

ตอน Test เราก็สามารถ Inject ของเข้ามาผ่าน Constructor ได้เลย

Leave a Reply