Unity
UnityフレームワークはC#で一般的に使用されるIOCフレームワークです。Unityを学ぶことは、IOCについてある程度理解している必要があることを示唆しています。他のIOCフレームワークと同様に、Unityの役割は、依存関係の注入と制御の反転を使用して、高度なデカップリングを実現することです。
Unityの使用
Unityの使用を開始するのは比較的簡単です。多くの構成を必要とするJavaのSpringとは異なります。それでは、すぐに使用する方法を学びましょう。
1.プロジェクトの構築
1.インターフェース
public interface IFood
{
string Name {
set; get; }
}
2.実装クラス
public class Banana:IFood
{
public string Name {
get; set; } = string.Empty;
}
public class Apple:IFood
{
public string Name {
get; set; } = string.Empty;
}
public class Beef:IFood
{
public string Name {
get; set; } = string.Empty;
}
1.IOCコンテナの構築
オブジェクトの使用を管理するプログラムであるため、まず、オブジェクトの作成と保存を管理するためのコンテナが必要です。このようにして、必要なときに必要なオブジェクトを選択できます。
public static IUnityContainer Container = new UnityContainer();
2.インスタンスの登録と取得
1.フルバージョンを登録して入手する方法
IUnityContainer RegisterInstance(Type type,string name, object instance,LifetimeManager lifetime);
Container
このメソッドを呼び出すことにより、インスタンスをコンテナに登録できます。
パラメータ1:type
インスタンスのタイプを指定します
パラメータ2:インスタンスname
の名前を指定します
パラメータ3:instance
登録するインスタンスを指定します
パラメータ4:lifetime
インスタンスのライフサイクルを指定します(Unityには6つの組み込みのライフタイム管理モデルがあります。デフォルトではTransientLifetimeManager
毎回新しいインスタンスを取得します)
public static T Resolve<T>(string name);
Container
このメソッドを呼び出すことにより、指定された名前のインスタンスを取得できます。
汎用:T
取得するインスタンスのタイプを指定します
パラメーター1:取得name
するインスタンスの名前を指定します
Container
この名前のインスタンスは、タイプに一致するコンテナーで返されます。
class Program
{
//新建IOC容器
public static IUnityContainer Container = new UnityContainer();
public static void Main(string[] args)
{
Banana banana = new Banana
{
Name = "香蕉"
};
Apple apple = new Apple
{
Name = "苹果"
};
//注册IFood类型的实例banana到容器中,key为banana。
//TransientLifetimeManager表示每次获取该类型都是一个新实例。
Container.RegisterInstance(typeof(IFood), "banana", banana,
new TransientLifetimeManager());
//获取IFood类型,key为banana的实例
food = Container.Resolve<IFood>("banana");
//因为每次获取该类型都新创建一个实例,因此名字不是香蕉而是空字符串。
Console.WriteLine("取得的食物是:" + food.Name);
Console.ReadLine();
}
}
2.インスタンスのライフサイクル
ライフサイクルのLifetimeManager
抽象クラス:この抽象クラスは、インスタンスのライフサイクルを記述します。インスタンスの
6つの異なるライフサイクルを表す6つのサブクラスがあります。
TransientLifetimeManager
リクエストごとに新しいタイプのオブジェクトインスタンスを生成します。(デフォルト)
このパラメーターを使用すると、取得されるすべてのインスタンスが真新しいものになります。
ContainerControlledLifetimeManager
各リクエストは登録済みインスタンス(シングルトンモード)
です。このパラメーターを使用すると、シングルトンモードを実現できます。毎回取得されるインスタンスは同じです。
その他については、Unityコンテナのオブジェクトライフタイム管理をお読みください。ここでは拡張はありません。
3.簡略化された方法
1)ライフサイクルを省略します
IUnityContainer RegisterInstance( Type type, string name, object instance);
ライフサイクルが省略された後、他のパラメータ関数は変更されず、ライフサイクルはデフォルトのライフサイクルを使用します。
つまり、各買収はまったく新しいインスタンスです。
2)名前を省略します
IUnityContainer RegisterInstance(Type type,object instance);
インスタンス名を省略した場合、名前付きインスタンスの取得方法は使用できません。このタイプのインスタンス
をpublic static T Resolve<T>();
取得するためにのみ使用してください。
キーを使用してインスタンスを取得すると、同じタイプの異なるインスタンスを正確に取得できます。
キーを使用しない場合、そのタイプのインスタンスを1つだけ1つのタイプに格納できます。2回目の登録では、前のインスタンスが上書きされます。
同じキーを使用してインスタンスを登録する場合。次に、このキーの以前に登録されたインスタンスを上書きします。
public static void Main(string[] args)
{
//注册
Banana banana = new Banana
{
Name = "香蕉"
};
Apple apple = new Apple
{
Name = "苹果"
};
Beef beef = new Beef
{
Name = "牛肉"
};
//注册IFood类型的实例banana。
Container.RegisterInstance(typeof(IFood),banana);
//使用
//获取IFood类型的实例
var food =Container.Resolve<IFood>();
Console.WriteLine("取得的食物1是:"+food.Name);
//为容器注入新的IFood类型实例会覆盖之前注册的IFood实例
Container.RegisterInstance(typeof(IFood),apple);
//获取IFood类型的实例
food = Container.Resolve<IFood>();
Console.WriteLine("取得的食物2是:" + food.Name);
//注册一个key为'banana'的实例
Container.RegisterInstance(typeof(IFood), "banana", banana,
new ContainerControlledLifetimeManager());
food = Container.Resolve<IFood>("banana");
Console.WriteLine("取得的食物1是:" + food.Name);
//再注册一个key为'banana'的实例
Container.RegisterInstance(typeof(IFood), "banana", beef,
new ContainerControlledLifetimeManager());
food = Container.Resolve<IFood>("banana");
Console.WriteLine("取得的食物2是:" + food.Name);
Console.ReadLine();
}
結果:
3)タイプを省略
IUnityContainer RegisterInstance(object instance);
タイプが指定されていない場合、デフォルトの宣言は登録されたインスタンスのタイプです。
public static void Main(string[] args)
{
//注册
Banana banana = new Banana
{
Name = "香蕉"
};
//注册IFood类型的实例banana。
Container.RegisterInstance(banana);
//使用
//获取IFood类型的实例
var food =Container.Resolve<Banana>();
Console.WriteLine("取得的食物1是:"+food.Name);
}
現時点では、このIFood
タイプのインスタンスを取得できません。バナナはBanana
タイプだからです。ただし、バナナをIFood
タイプとして宣言する場合は、IFood
タイプ取得を使用することもできます。
これは、コンテナへの登録時に使用されるタイプが、インスタンス自体のタイプではなく、インスタンスが宣言されたときのタイプであることを示しています。
4)ジェネリックを使用して登録タイプを
IUnityContainer RegisterInstance<T>(object instance);
指定し、タイプとインスタンスのみを指定します。
IUnityContainer RegisterInstance<T>(string name, object instance);
タイプ、キー値、およびインスタンスを指定します。
IUnityContainer RegisterInstance<T>(string name, object instance,LifetimeManager lifetime);
タイプ、キー値、インスタンス、およびライフサイクルを指定します。
インスタンスのタイプをパラメーターからメソッドgenericに移動します。パラメータが削減され、実際の使用方法は変更されません。
後で、他の登録方法と構成方法を紹介します。続く〜