آموزش اصل Inversion of Control در برنامه نویسی #13 قسمت دوازدهم از یک سری آموزشی از وبسایت پرووید است که در رابطه با اصل Inversion of Control تنظیم شده است. پس از این دوره ی آموزشی می توانید از بسته های آموزشی وبسایت پرووید در رابطه با Inversion of Control را استفاده کنید.

در قسمت قبلی از این آموزش در مورد اینکه انتزاع یا Abstraction چیست صحبت کردیم.

سوالی که ممکن است در این قسمت مطرح شود این است که در Interface یا کلاس Abstract ی خواهیم ساخت چه چیزی را باید قرار دهیم؟ همان طور که ممکن است یادتان باشد دیدید که کلاس CustomerBusinessLogic از مدتی به نام GetCustomerName که در کلاس DataAccess تعریف شده بود استفاده می‌کرد. دقت کنید که در دنیای واقعی ممکن است متد های بیشتری در رابطه با کار کردن با داده ‌های Customer در کلاس DataAccess تعریف شود. اما برای مثال ما همین یک متد کفایت می کند. در واقع ما باید همین متد را در Interface مان قرار دهیم.

بسته ی جامع آموزش Inversion of Control و IoC Container ها

از شما دعوت می کنیم که از بسته ی جامع آموزش Inversion of Control و IoC Container ها دیدن کنید.

همان طور که در کد زیر می‌بینید Interface ی با نام ICustomerDataAcces تعریف شده است و در آن متد GetCustomerName قرار داده شده است که یک پارامتر ورودی از نوع Interface دریافت می کند.

public interface ICustomerDataAccess
{
    string GetCustomerName(int id);
}

در ادامه کلاس CustomerDataAcces را داریم که اینترفیس ICustomerDataAcces را پیاده سازی می کند.

 

public class CustomerDataAccess: ICustomerDataAccess
{
    public CustomerDataAccess()
    {
    }

    public string GetCustomerName(int id) {
        return "Dummy Customer Name";        
    }
}

لطفا دقت کنید که ما نام کلاس را از DataAccess به CustomerDataAcces تغییر داده ایم. این موضوع می تواند به قابلیت Readability (قابلیت خوانایی) برنامه کمک کند. پس از آن ما نیاز داریم کلاس DataAccessFactory را طوری تغییر دهیم که به جای برگرداندن یک شی از کلاس DataAccess یک شی از اینترفیس ICustomerDataAcces را برگرداند.

public class DataAccessFactory
{
    public static ICustomerDataAccess GetCustomerDataAccessObj() 
    {
        return new CustomerDataAccess();
    }
}

در ادامه کلاس CustomerBusinessLogic را می بینیم که به جای استفاده کردن از کلاس DataAccess از اینترفیس ICustomerDataAcces استفاده می‌ کند.

public class CustomerBusinessLogic
{
    ICustomerDataAccess _custDataAccess;

    public CustomerBusinessLogic()
    {
        _custDataAccess = DataAccessFactory.GetCustomerDataAccessObj();
    }

    public string GetCustomerName(int id)
    {
        return _custDataAccess.GetCustomerName(id);
    }
}

تا اینجای کار ما توانسته ایم که اصل Dependency Inversion را در مثال خود پیاده سازی کنیم. هم اکنون ماژول سطح بالای ما یعنی کلاس CustomerBusinessLogic به ماژول سطح پایین یعنی CustomerDataAccess وابسته نیست. بلکه هر دوی آنها به یک Abstraction که در قالب یک اینترفیس با نام ICustomerDataAcces پیاده سازی شده است وابسته هستند.

در قسمت بعدی از این آموزش در مورد ادامه ی همین مبحث صحبت خواهیم کرد.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *