依赖注入的优点
(1)有效地设计服务及其依赖关系。
(2)防止多线程问题。
(3)防止内存泄漏。
(4)防止潜在的错误。
Caliburn.Micro主要用在MVVM, WPF, WinRT, UWP, Xamarin, Android, iOS, CoC, Convention, MVP, PM, Screen, Coroutine, Behavior, Model-View-ViewModel, Presentation, UI, ViewModel, Caliburn就是说控制台应用是用不了Caliburn.Micro的
代码下载
一、创建项目
创建WPF项目,使用.net6
引入Caliburn.Micro
新建Bootstrapper类,内容如下
using Caliburn.Micro;
using FileLogger;
using System;
using System.Collections.Generic;
using UnityDataServiceGui.Modules.Main.ViewModels;
namespace UnityDataServiceGui
{
public class Bootstrapper : BootstrapperBase
{
private SimpleContainer _container;
public Bootstrapper()
{
Initialize();
}
protected override void Configure()
{
_container = new SimpleContainer();
_container.Singleton<IWindowManager, WindowManager>();
_container.Singleton<IEventAggregator, EventAggregator>();
_container.Singleton<Log4netLogger>();
//一定要注入进去,否则打不开窗体
_container.Singleton<MainWindowViewModel>();
}
protected override object GetInstance(Type service, string key)
{
return _container.GetInstance(service, key);
}
protected override IEnumerable<object> GetAllInstances(Type service)
{
return _container.GetAllInstances(service);
}
protected override void BuildUp(object instance)
{
_container.BuildUp(instance);
}
protected override void OnStartup(object sender, System.Windows.StartupEventArgs e)
{
try
{
var logger = IoC.Get<Log4netLogger>();
logger.Initialize("UnityDataServiceGui");
logger.LogLevel = LoggingEventType.Debug;
//打开窗口方法1
var windowManager = IoC.Get<IWindowManager>();
var mainWindows = IoC.Get<MainWindowViewModel>();
windowManager.ShowWindowAsync(mainWindows);
//打开窗口方法2
//DisplayRootViewFor<MainWindowViewModel>();
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
}
引入依赖
新建目录、窗体、mode,MainWindowViewModel和MainWindowView的名称是约定俗成
MainWindowViewModel.cs引入Caliburn.Micro
修改App.xmal,必须添加<local:Bootstrapper x:Key="Bootstrapper"/>,作为启动项
<Application x:Class="UnityDataServiceGui.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:UnityDataServiceGui">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<local:Bootstrapper x:Key="Bootstrapper"/>
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
二、运行项目
三、日志接口注入测试
项目改成控制台应用程序,这样可以看到Console输出
测试代码
namespace UnityDataServiceGui.Modules.Main.ViewModels
{
public class MainWindowViewModel : Screen
{
readonly Log4netLogger _logger;
public MainWindowViewModel(Log4netLogger logger)
{
_logger = logger;
_logger.Warn(typeof(MainWindowViewModel),"这是一个测试程序!");
}
}
}
测试