今日28/11/2020



IDC、ディップおよび依存性注入

導入
それで、今日、私は私が次に何を学ぶべきであるかについて、私自身に尋ねました.
このポストでは、私は素人の言葉で読んだことを説明しようとします.

IOC
IOCは「制御の反転」を意味し、設計原理ではなく設計原理である.
名前によって、オブジェクト指向デザインで異なる種類のコントロールを無効にするために使用されます.
つのクラスの緩く結合した手段変化は、他のクラスを変えるのを強制してはいけません.
IOC原理は、それらをテスト可能で、保守可能で、拡張可能にする緩く結合したクラスを設計するのに役立ちます.
それを理解する簡単な方法は、それを説明することです.それで、クラスは1つの責任だけを持っていなければなりません.あなたは他の何か(おそらくクラスに)に余分な責任をコントロールする必要があります.
namespace Ioc
{
    class Program
    {
        static void Main(string[] args)
        {
           Console.WriteLine("Enter First Name:");
           var firstName = Console.ReadLine();
           Console.WriteLine("Enter Last Name:");
           var lastName = Console.ReadLine();
           Console.WriteLine("Do you want to save it? Y/N: ");
           var wantToSave = Console.ReadLine();
           if (wantToSave.ToUpper() == "Y")
                   SaveToDB(firstName, lastName);

           private static void SaveToDB(string firstName,
                                                  string lastName)
           {
            //save firstName and lastName to the database here..
           }
        }
    }
^ IOCはGUIベースのアプリケーションを作成することによって上記のプログラムに適用できます.
public class CustomerBusinessLogic
{
    DataAccess _dataAccess;

    public CustomerBusinessLogic()
    {
        _dataAccess = new DataAccess();
    }

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

public class DataAccess
{
    public DataAccess()
    {
    }

    public string GetCustomerName(int id) {
        return "Dummy Customer Name"; // get it from DB in real app
    }
}
IOC実装なし
public class CustomerBusinessLogic
{

    public CustomerBusinessLogic()
    {
    }

    public string GetCustomerName(int id)
    {
        DataAccess _dataAccess =  
               DataAccessFactory.GetDataAccessObj();

        return _dataAccess.GetCustomerName(id);
    }
}
public class DataAccess
{
    public DataAccess()
    {
    }

    public string GetCustomerName(int id) {
        return "Dummy Customer Name"; // get it from DB in real app
    }
}
public class DataAccessFactory
{
    public static DataAccess GetDataAccessObj() 
    {
        return new DataAccess();
    }
}
とIOC実装

上記のように、クラスCustomerBusinlogicはDataAccessFactoryクラスを使用してクラスDataAccessのオブジェクトを取得します.したがって、クラスCustomerBusinlogicからDataAccessFactoryの依存オブジェクトの作成を反転しました.クラスCustomerBusinessLogicはもはやクラスDataAccessのオブジェクトを作成しません.代わりに、DataAccessFactoryクラスを使用して、クラスDataAccessのオブジェクトを取得します.

ディップ
dipは「従属性反転原理」を表し,緩く結合したクラスを達成する第2ステップである.
ディップは、固体のオブジェクト指向の原則の一つです.

2つの部分に分けられる
1高レベルモジュールは低レベルモジュールに依存してはいけません.両方とも抽象化に依存するべきです.
2 .抽象化は詳細に依存してはならない.詳細は抽象化に依存します.
高レベルモジュールは他のモジュールに依存するモジュールであり、他のモジュールに依存しないモジュールは低レベルです.
public class CustomerBusinessLogic
{

    public CustomerBusinessLogic()
    {
    }

    public string GetCustomerName(int id)
    {
        DataAccess _dataAccess =  
               DataAccessFactory.GetDataAccessObj();

        return _dataAccess.GetCustomerName(id);
    }
}
public class DataAccess
{
    public DataAccess()
    {
    }

    public string GetCustomerName(int id) {
        return "Dummy Customer Name"; // get it from DB in real app
    }
}
public class DataAccessFactory
{
    public static DataAccess GetDataAccessObj() 
    {
        return new DataAccess();
    }
}
ディップ実装なし
public interface ICustomerDataAccess
{
    string GetCustomerName(int id);
}

public class CustomerBusinessLogic
{
    ICustomerDataAccess _custDataAccess;

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

    public string GetCustomerName(int id)
    {
        return _custDataAccess.GetCustomerName(id);
    }
}
public class DataAccess: ICustomerDataAccess
{
    public DataAccess()
    {
    }

    public string GetCustomerName(int id) {
        return "Dummy Customer Name"; // get it from DB in real app
    }
}
public class DataAccessFactory
{
    public static ICustomerDataAccess GetCustomerDataAccessObj() 
    {
        return new CustomerDataAccess();
    }
}
ディップ実装

上の例でdipを実装する利点は、CustomerBusinessLogicクラスとCustomerDataAccessクラスが疎結合クラスであることです.CustomerBusinessLogicが具体的なDataAccessクラスに依存しないため、ICustomerDataAccessインターフェイスの参照が含まれます.今のところ、別の実装で簡単にICustomerDataAccessを実装するクラスを使用できます.

依存性注入
依存性注入(di)はiocを実装するために使用される設計パターンである.
これは、クラスの外側に依存するオブジェクトの作成を可能にし、さまざまな方法でクラスにこれらのオブジェクトを提供します.

依存性注入パターンには3種類のクラスが含まれます
1 .クライアントクラス:クライアントクラス(依存クラス)はサービスクラスに依存するクラスです.
2 . Serviceクラス:サービスクラス(依存関係)は、クライアントクラスにサービスを提供するクラスです.
Injectionクラス:Injectionクラスはサービスクラスオブジェクトをクライアントクラスに注入します.

依存性注入のタイプ
コンストラクタインジェクション:コンストラクタの注入で、インジェクタはクライアントクラスのコンストラクタを通してサービス(依存)を供給します.
2プロパティの注入:プロパティインジェクション(設定セッター)で、インジェクタはクライアントクラスのパブリックプロパティを介して依存関係を提供します.
メソッドの注入:このタイプの注入では、クライアントクラスは、依存性を供給するメソッドを宣言するインターフェイスを実装します.インジェクタは、このインターフェイスを使用して依存関係をクライアントクラスに供給します.
public class CustomerBusinessLogic
{
    ICustomerDataAccess _dataAccess;

    public CustomerBusinessLogic(ICustomerDataAccess 
                               custDataAccess)
    {
        _dataAccess = custDataAccess;
    }

    public CustomerBusinessLogic()
    {
        _dataAccess = new CustomerDataAccess();
    }

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

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

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

    public string GetCustomerName(int id) 
    {
        //get the customer name from the db in real application        
        return "Dummy Customer Name"; 
    }
}
public class DataAccessFactory
{
    public static ICustomerDataAccess GetCustomerDataAccessObj() 
    {
        return new CustomerDataAccess();
    }
}
public class CustomerService
{
    CustomerBusinessLogic _customerBL;

    public CustomerService()
    {
        _customerBL = new CustomerBusinessLogic(new 
                             CustomerDataAccess());
    }

    public string GetCustomerName(int id) {
        return _customerBL.ProcessCustomerData(id);
    }
}
コンストラクタ

上記の例でわかるように、CustomerServiceクラスはCustomerDataAccessオブジェクトをCustomerBusinessLogicクラスに作成し、注入します.このように、CustomerBusinessClassクラスは、新しいキーワードを使用してCustomerDataAccessのオブジェクトを作成するか、ファクトリクラスを使用する必要はありません.呼び出しクラス(CustomerService)は、CustomerBusinessLogicクラスに適切なDataAccessクラスを作成して設定します.
public class CustomerBusinessLogic
{
    public CustomerBusinessLogic()
    {
    }

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

    public ICustomerDataAccess DataAccess { get; set; }
}

public class CustomerService
{
    CustomerBusinessLogic _customerBL;

    public CustomerService()
    {
        _customerBL = new CustomerBusinessLogic();
        _customerBL.DataAccess = new CustomerDataAccess();
    }

    public string GetCustomerName(int id) {
        return _customerBL.GetCustomerName(id);
    }
}
プロパティ注入

このように、CustomerBusinessClassクラスには、DataStudioクラスを実装するクラスのインスタンスを設定できるDataAccessという名前のパブリックプロパティが含まれます.したがって、CustomerServiceクラスは、このパブリックプロパティを使用してCustomerDataAccessクラスを作成して設定します.
interface IDataAccessDependency
{
    void SetDependency(ICustomerDataAccess customerDataAccess);
}

public class CustomerBusinessLogic : IDataAccessDependency
{
    ICustomerDataAccess _dataAccess;

    public CustomerBusinessLogic()
    {
    }

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

    public void SetDependency(ICustomerDataAccess customerDataAccess)
    {
        _dataAccess = customerDataAccess;
    }
}

public class CustomerService
{
    CustomerBusinessLogic _customerBL;

    public CustomerService()
    {
        _customerBL = new CustomerBusinessLogic();
        ((IDataAccessDependency)_customerBL)
                  .SetDependency(new CustomerDataAccess());
    }

    public string GetCustomerName(int id) {
        return _customerBL.GetCustomerName(id);
    }
}
メソッド注入

上の例では、CustomerBusinessClassクラスによってIDataAccessenciesインターフェイスが実装されています.したがって、InjectionクラスCustomerServiceは、このクラスを使用して依存クラス(CustomerDataAccess)をクライアントクラスに注入します.

質問
I . IOC容器を学ぶべきですか?
2 . IOC容器を使うべきですか.

次の目標
次の目標は、xamarinとxamarin自体のmvvmcrossを学ぶことです.
任意のヒントや提案は、コメントやDMを私に自由に感じ有用です.