我在MVVMCross中使用WPF Sqlite插件,但我想覆盖数据库写入的目录。我编写了一个自定义ISQLiteConnectionFactory
,它目前驻留在我的WPF引导程序项目中:
internal class CustomMvxWpfSqLiteConnectionFactory : ISQLiteConnectionFactory
{
const string DirectoryName = "ProductName";
public ISQLiteConnection Create(string address)
{
var appData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
var dir = Path.Combine(appData, DirectoryName);
Directory.CreateDirectory(dir);
var path = Path.Combine(dir, address);
return new SQLiteConnection(path, SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create, false);
}
}
我无法弄清楚如何覆盖Mvx.RegisterSingleton<ISQLiteConnectionFactory>(new MvxWpfSqLiteConnectionFactory());
所做的Cirrious.MvvmCross.Plugins.Sqlite.Wpf.Plugin
。
我的PCL项目App
在Initialize期间注册了一个依赖于ISQLiteConnectionFactory
的单件服务,因此我显然希望在此之前覆盖IOC注册。但无论我做什么,插件注册MvxWpfSqLiteConnectionFactory
而不是我自己注册CustomMvxWpfSqLiteConnectionFactory
似乎优先。
我已经尝试将我的注册调用放在我的WPF Setup.cs中的各种覆盖中,但到目前为止还没有任何工作。
答案 0 :(得分:1)
有关如何加载插件的文章包含在https://github.com/MvvmCross/MvvmCross/wiki/MvvmCross-plugins#how-plugins-are-loaded
中默认情况下,Sqlite插件在安装程序的PerformBootstrapActions
期间初始化 - 请参阅https://github.com/MvvmCross/MvvmCross/wiki/Customising-using-App-and-Setup#setupcs,了解启动顺序中的位置。
从您的问题来看,目前尚不清楚您尝试过的设置中有哪些覆盖 - 我不确定“各种”包括哪些位置。但是,听起来想要在ISQLiteConnectionFactory
之后和PerformBootstrapActions
之前的任何时候注册InitializeApp
- 所以一种方法是覆盖InitializeApp
:
protected virtual void InitializeApp(IMvxPluginManager pluginManager)
{
// your code here
base.InitializeApp(pluginManager);
}
要考虑的其他一些想法:
BasePath
CreateEx
选项以允许该文件夹为指定 - 请参阅https://github.com/MvvmCross/MvvmCross-SQLite/blob/master/Sqlite/Cirrious.MvvmCross.Community.Plugins.Sqlite.Wpf/MvxWpfSqLiteConnectionFactory.cs#L24