Реализуем обобщенную фабрику

public interface IFactory<TContext, TObject>
{
        TObject Create(TContext context);
}

public class DefaultFactory<TContext, TObject> : IFactory<TContext, TObject>
{
    private Func<TContext, TObject> _factory;
    public DefaultFactory()
    {
    }
    public DefaultFactory(Func<TContext, TObject> factory)
    {
        _factory = factory;
    }
    public virtual TObject Create(TContext context)
    {
        if (_factory == null)
            throw new NotImplementedException("It is necessary to implement factory method.");

        return _factory(context);
    }
}

Реализация готова! Осталось привести пример :). Допустим есть такой абстрактный и производный класс:

public abstract class Product
{
    public abstract string Name { get; }
}

public class MyProduct : Product
{
    public override string Name { get; } = "My product";
}

Создадим фабрику на основе лямбда выражения. Такая фабрика очень хороша, когда не имеет зависимостей, которые нужно разрешить. После создания такую фабрику можно зарегистрировать сразу в DI контейнере.

var productFactory = new DefaultFactory<string, Product>((context) => new MyProduct());

И создадим полноценную фабрику с разрешением зависимостей:

public class ProductFactory: DefaultFactory<string, Product>
{
    private IDependencyService _dependencyService;
    public ProductFactory(IDependencyService dependencyService)
    {
        _dependencyService = dependencyService
    }
    public override Product Create(string context)
    {
        return new MyProduct(_dependencyService);
    }
}

var productFactory = new ProductFactory();
По теме:
Запускаем asp.net-mvc приложения в vs в разных средах

В mvc приложении есть файл Web.config который отвечает за главные настройки приложения. И есть файлы Web.Debug.config и Web.Release.config, которые переопределяют Read more

Выполняем get запрос по расписанию c#

Напишем простенькую программу, которая будет выполнять get запрос по истечению определенного интервала времени. class Program { private static Timer _timer; Read more

Выполняем действие по расписанию (asp.net, c#)

Раньше я писал программку, которая выполняла get запрос по расписанию, но так же можно написать обычный HttpModule, который будет делать Read more

Выбираем технологии и инструменты для разработки веб приложений

1 Выбор и настройка инструментов для разработки фронтенда (только самые важные): 1.1 Twitter bootstrap — фреймворк позволяет писать качественную верстку Read more

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *