说明
CommunityToolkit.Mvvm包不提供ioc功能,但是官方建议使用:Microsoft.Extensions.DependencyInjection使用IOC
安装
nuget:Microsoft.Extensions.DependencyInjection 包
接口和服务的定义实现
public interface IBill { bool IsExistId ( string name ); string GetData ( string name ); }
public class BillService : IBill { public string GetData ( string name ) { return string.Format( "name:{0}" , name ); } public bool IsExistId ( string name ) { return name == "qq"; } }
App.xaml.cs注册
public partial class App : Application { /// /// Gets the current instance in use /// public new static App Current => ( App ) Application.Current; /// /// Gets the instance to resolve application services. /// public IServiceProvider Services { get; } public App () { Services = ConfigureServices(); this.InitializeComponent(); } private static IServiceProvider ConfigureServices () { var services = new ServiceCollection(); // 注册Services services.AddSingleton(); services.AddSingleton(); //services.AddSingleton(); // 注册Viewmodels // 不是每个Viewmodels都得来AddTransient,如果Viewmodels不需要ioc,可以不用这里注册 services.AddTransient(); return services.BuildServiceProvider(); } }
view中使用
原有的view与viewmodel的绑定方式改变如下:
public partial class Window1 : Window { public Window1 () { InitializeComponent(); // this.DataContext = new WindowViewModel1(); 这样不可以使用了,请用App.Current.Services.GetService this.DataContext = App.Current.Services.GetService(); //代码任何处,都可以使用App.Current.Services.GetService获取到服务 //IFilesService filesService = App.Current.Services.GetService(); } }
readonly Service.Service.IBill _IBill; public WindowViewModel1 ( Service.Service.IBill iBill ) { this._IBill = iBill; } [RelayCommand( CanExecute = nameof( CanButton ) )] void ButtonClick () { //点击按钮,修改标题 if ( this._IBill.IsExistId( Title ) ) { Title = "qq" + this._IBill.GetData( Title ); } else { Title = "qq"; } }
this.DataContext = App.Current.Services.GetService(); //代码任何处,都可以使用App.Current.Services.GetService获取到服务 IFilesService filesService = App.Current.Services.GetService();
1