So now I can choose between Postgresql, Sqlite, SqlServer and MongoDb . Next phase is when the app administrator chooses a database- and you expect the app to start with this selection of database provider. So 2 new functions are needed, in which the provider name, connection string and database name are saved
public static async Task<bool> SaveChosenPlugin(IDainEF_Data dainEF, string? pluginsDirectory= null,IDainEF_Data_CR? cr= null)
{
cr ??= new DainEF_Data_CR(pluginsDirectory);
return await cr.Save(dainEF);
}
public static async Task<(IEFCore_DatabasePlugin_10?,IDainEF_Data?)> RetrieveLatestChosenPlugin(string? pluginsDirectory=null, IDainEF_Data_CR? cr = null)
{
pluginsDirectory ??= Path.Combine(AppContext.BaseDirectory, "plugins");
cr ??= new DainEF_Data_CR(pluginsDirectory);
var data= await cr.Retrieve();
if (data == null) return (null,null);
var discoveredAssemblies = EfCorePluginLoader_10.DiscoverPluginAssemblies(pluginsDirectory);
foreach (var assembly in discoveredAssemblies)
{
var loaded = LoadFromAssembly(assembly, isUnloadable: false);
foreach (var plugin in loaded)
{
if (string.Equals(plugin.ProviderName, data.PluginName)) return (plugin,data);
}
}
return (null,data);
}
And there is a test for that
[Fact]
public async Task TestLoad10_SaveAndRetrievePlugin()
{
await TestLoad10();
DainEF_Data data =new DainEF_Data();
data.PluginName = "MongoDB";
data.ConnectionString = "fake";
data.DatabaseName= "fakeAgain";
var b = await EfCorePluginLoader_10.SaveChosenPlugin(data);
Assert.True(b,"must have saved");
var (plugin,dataDain) = await EfCorePluginLoader_10.RetrieveLatestChosenPlugin();
Assert.NotNull(plugin);
Assert.NotNull(dataDain);
Assert.Equal(plugin.ProviderName, data.PluginName);
Assert.Equal(dataDain.PluginName, data.PluginName);
Assert.Equal(dataDain.ConnectionString, data.ConnectionString);
Assert.Equal(dataDain.DatabaseName, data.DatabaseName);
}