Это кажется излишним, но основная стратегия в таких случаях - создать общий интерфейс и разделить их в разных проектах.Не уверен, что это оптимальное решение для этого случая.
Тогда различные проекты независимы (за исключением общего интерфейса) и могут легко расширяться со временем.
Важнейшей частью являетсяв вашем основном проекте только ссылка на интерфейс сборки, а не на один из бетонов.Бетоны (сборки) должны быть загружены во время выполнения, если вы хотите избежать FileNotFoundException
: более того: вам нужен механизм для выбора подходящего, обычно называемого factory
.
.в случае, если у вас есть 3 из них (sql, sqllite и oracle):
Первое, что нужно сделать, - это создать общий интерфейс для связи с подходящим Db enginge, например:
//separate assembly
public interface IDbEningeSelector
{
//added the option builder for simplicity: one could do better.
void Configure(string connectionString,IOptionsBuilder optionsBuilder);
}
Далее просто создайте 3 отдельных проекта для конкретных реализаций: один sql-lite, один sql и один оракул.
Далее: создайте в трех проектах класс, который реализует это:
//3 of these.
public class SqlEnging : IDbEngineSelector
{
public void Configure(string connectionString,IOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer(connectionString);
}
}
Хорошо, теперь у вас есть выбор, чтобы выбрать один из них.
//the "thing"
IDbEngineSelector selector = null;
selector = //resolve through factory, possibly based on a flag.
selector.Configure(connectionString, optionsBuilder);
И в основном все готово, и у вас есть расширяемая, динамически называемая система провайдера базы данных.
Для распознавателя динамических сборок вам нужно будет загрузить их, как описано в этой статье: https://www.codeproject.com/Articles/1194332/Resolving-Assemblies-in-NET-Core
Это будет фактически загружать зависимости во время выполнения, я мог бы быть хорошей идеейзарезервироватьспециальный путь для этой цели, куда вы помещаете эти сборки.
Я не учел детали реализации фабрики, мне нужно сначала проверить правильный способ сделать это в .net Core, подождать ...