天天看點

WPF PRISM開發入門二(Unity依賴注入容器使用)

原文: WPF PRISM開發入門二(Unity依賴注入容器使用) 這篇部落格将通過一個控制台程式簡單了解下PRISM下Unity依賴注入容器的使用。我已經建立了一個例子,通過一個控制台程式進行加減乘除運算,項目當中将輸入輸出等都用接口封裝後,結構如下:

WPF PRISM開發入門二(Unity依賴注入容器使用)
目前代碼可以點選 這裡

下載下傳。

運作效果如下:

WPF 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除了可以使用代碼來注冊類,還可以使用配置檔案的方式。

感謝您的閱讀,代碼點選