本篇文章介紹如何使用Json.NET來反射生成JSON設定檔中所定義的功能物件,讓開發人員能夠透過設定簡單的JSON檔案、簡潔易懂的指令,來提供系統使用依賴注入的功能。主要為自己留個紀錄,也希望能幫助到有需要的開發人員。
[.NET] 使用Json.NET提供依賴注入功能(Dependence Injection)
前言
在一些小型專案的開發情景裡,系統不需要大型DI Framework所提供的:單一物件生成、生命週期管理...等等延伸功能,只需要,單純使用反射生成功能,從設定檔取得功能物件來注入到系統。在這樣的開發情景中,如果選擇Spring .NET、Unity來做為系統的依賴注入模組,無形中就增加了系統的技術門檻、增加了開發人員的知識負擔。
本篇文章介紹如何使用Json.NET來反射生成JSON設定檔中所定義的功能物件,讓開發人員能夠透過設定簡單的JSON檔案、簡潔易懂的指令,來提供系統使用依賴注入的功能。主要為自己留個紀錄,也希望能幫助到有需要的開發人員。
開發
加入Json.NET
使用Visual Studio開啟專案之後,開發人員可以透過內建的NuGet封裝管理員來安裝Json.NET套件。
建立依賴注入的介面與實作
建立專案並且加入Json.NET套件之後,就可以先著手在專案內,建立系統所需要依賴注入的介面與實作。
public interface IAnimal
{
// Methods
void Hit();
}
public class Dog : IAnimal
{
// Methods
public void Hit()
{
Console.WriteLine("Dog : " + "Running");
}
}
public class Cat : IAnimal
{
// Fields
private readonly string _cry = null;
// Constructors
public Cat(string cry)
{
// Default
_cry = cry;
}
// Methods
public void Hit()
{
Console.WriteLine("Cat : "+ _cry);
}
}
建立反射生成的設定檔
接著使用Json.NET所定義的格式,來建立物件反射生成所需要的JSON設定檔。在這份設定檔中,每個物件的「$type」屬性使用逗號來切割內容。逗號前的內容,代表了這個物件的命名空間+類別名稱;逗號後的內容代表了這個物件的組件名稱。而其他「$type」之外的屬性,則是會被剖析為物件的建構參數、物件屬性。
[
{
"$type": "JsonDISample.Dog, JsonDISample"
},
{
"$type": "JsonDISample.Cat, JsonDISample",
"cry": "Meow"
},
{
"$type": "JsonDISample.Cat, JsonDISample",
"cry": "Purr"
}
]
使用Json.NET注入物件
最後使用下列程式碼,從檔案中讀取JSON設定檔內容,再使用JsonConvert.DeserializeObject反射生成物件,就可以將Json.NET生成的介面與實作,注入系統來使用。另外,在這段程式碼中,要特別注意「JsonSerializerSettings.TypeNameHandling」這個屬性必須要設定為All,這樣Json.NET才會特別去處理$type屬性來反射生成指定物件。
static void Main(string[] args)
{
// ConfigJson
string configJson = System.IO.File.ReadAllText("animals.json");
if (configJson == null) throw new InvalidOperationException();
// SerializerSettings
var serializerSettings = new JsonSerializerSettings();
serializerSettings.TypeNameHandling = TypeNameHandling.All;
// Animal
var animalList = JsonConvert.DeserializeObject<List<IAnimal>>(configJson, serializerSettings);
if (animalList == null) throw new InvalidOperationException();
// Hit
foreach (var animal in animalList)
{
animal.Hit();
}
// End
Console.ReadLine();
}
執行
完成開發步驟後,就可以按下Visual Studio的執行按鈕來檢視成果。接著觀察程式執行的結果,可以發現系統的確依照JSON設定檔的內容,動態生成物件、並且提供這些物件給系統使用。
範例下載
範例程式:點此下載
能以更簡潔的文字與程式碼,傳達出程式設計背後的精神。
真正做到「以形寫神」的境界。