Плагін (шаблон проєктування)
Ця стаття не містить посилань на джерела. (березень 2023) |
Ця стаття не має інтервікі-посилань. |
Плагін (англ. Plugin) — шаблон проєктування, який дозволяє підставити значення для абстракції не під час компіляції, а під час виконання програми.[джерело?]
Опис[ред. | ред. код]
Один і той самий код виконується у різних середовищах, для розробки, тестування тощо. Для того, щоб не змінювати код, варто представити декілька реалізацій одного і того самого класу у кожному середовищі. Розробники вирішують цю проблема за допомогою фабрики, що обростає умовними операторами. Плутанина появляється не лише від кількості фабрик, але і від того, що конфігурацію можуть ускладнюватись.
Даний шаблон пропонує винести реєстрацію сервісів із коду в зовнішній ресурс та підставляти значення для абстракції під час виконання програми.
Реалізація[ред. | ред. код]
Нехай нам необхідно генерувати ідентифікатор для об'єкта, який буде збережений у сховище. Зрозуміло, що для розробки, нам головне швидкість, а для роботи надійність. Напишемо реалізацію обох класів, які потім підставлятимемо динамічно.
interface IdGenerator
{
int GetIdentifier();
}
class DevelopmentIdGenerator : IdGenerator
{
public int GetIdentifier()
{
return new Random().Next();
}
}
class ProductionIdGenerator : IdGenerator
{
public int lastId = 0;
public int GetIdentifier()
{
return lastId++;
}
}
Тоді напишемо фабрику, яка динамічно визначатиме необхідну реалізацію.
class ServiceFactory
{
public TInterface Get<TInterface>()
{
var configFile = File.ReadAllLines("Configuration.txt");
var configuration = configFile.ToDictionary(k => k.Split("->").First(), v => v.Split("->").Last());
var implementationName = configuration[typeof(TInterface).GetName()];
return Activator.CreateInstance(implementationName) as TInterface;
}
}
Сам файл конфігурацій може виглядати наступним чином, та при потребі змінюватись у кожному середовищі.
IdGenerator -> DevelopmentIdGenerator
Окрім файлів існують й інші способи збереження конфігурацій. Наприклад, це може бути зовнішній сервіс абощо.