這篇博客將通過一個控制台程序簡單了解下PRISM下Unity依賴注入容器的使用。我已經創建了一個例子,通過一個控制台程序進行加減乘除運算,項目當中將輸入輸出等都用接口封裝后,結構如下:
當前代碼可以點擊這里下載。
運行效果如下:
下面將引入Unity類庫,使用Unity來生成需要的對象實例。
先查看一下CalculateRelpLoop類,
public class CalculateRelpLoop : ICalculateRelpLoop { ICalculateService _calculateService; IInputParserService _inputParserService; IInputService _inputService; IOutputService _outputService; public CalculateRelpLoop() { _calculateService = new CalculateService(); _inputParserService = new InputParserService(); _outputService = new ConsoleOutputService(); _inputService = new ConsoleInputService(); } public void Run() { while(true) { try { string input = _inputService.ReadCommand(); Arguments args = _inputService.ReadArguments(); CommandType commandType = _inputParserService.CommandParser(input); string result = _calculateService.Execute(commandType, args).ToString(); _outputService.WriteMessage(result); } catch { _outputService.WriteMessage("Mistake!"); } } } }
主工程中調用Program.cs
static void Main(string[] args) { ICalculateRelpLoop loop = new CalculateRelpLoop(); loop.Run(); }
我們手動的創建這些類,然后調用其中的方法,這時候我們可以借助於Unity類來做,在主工程中引用Microsoft.Practices.Unity.dll, 對這兩個類進行一些調整。
修改后的CalculateRelpLoop類,
public class CalculateRelpLoop : ICalculateRelpLoop { ICalculateService _calculateService; IInputParserService _inputParserService; IInputService _inputService; IOutputService _outputService; public CalculateRelpLoop(ICalculateService calculateService, IInputParserService inputParserService, IInputService inputService, IOutputService outputService) { _calculateService = calculateService; _inputParserService = inputParserService; _outputService = outputService; _inputService = inputService; } public void Run() { while(true) { try { string input = _inputService.ReadCommand(); Arguments args = _inputService.ReadArguments(); CommandType commandType = _inputParserService.CommandParser(input); string result = _calculateService.Execute(commandType, args).ToString(); _outputService.WriteMessage(result); } catch { _outputService.WriteMessage("Mistake!"); } } } }
Program.cs
static void Main(string[] args) { UnityContainer container = new UnityContainer(); container.RegisterType<ICalculateRelpLoop, CalculateRelpLoop>(); container.RegisterType<ICalculateService, CalculateService>(); container.RegisterType<IInputParserService, InputParserService>(); container.RegisterType<IOutputService, ConsoleOutputService>(); container.RegisterType<IInputService, ConsoleInputService>(); ICalculateRelpLoop loop = container.Resolve<CalculateRelpLoop>(); loop.Run(); }
在Main方法中將需要實例化的類都先注冊進來,container.RegisterType<ICalculateRelpLoop, CalculateRelpLoop>(); 需要使用時,可以通過
container.Resolve<CalculateRelpLoop>()實例化出相應的對象引用。這樣一個類的實例化,銷毀等都交給了Unity來幫助我們完成。這樣代碼更加清爽整潔。PRISM默認提供了Unity依賴注入容器,當然我們也可以使用其他自己熟悉的依賴注入容器來代替。
另外Unity除了可以使用代碼來注冊類,還可以使用配置文件的方式。
感謝您的閱讀,代碼點擊這里下載。