Один из простейших DI фреймворков под .NET

18 Янв
2012

В данной статье на ваш суд представлен очередной DI-фреймворк под .NET — LightFactory (также доступен через NuGet). Он задумывался как гораздо более простая альтернатива Ninject’ам, CastleWindsor’ам, StructureMap’ам и прочим фреймворкам. Его основная «фишка» в производительности и простоте (и как следствие, в надежности).

Весь фреймворк представляет собой два public класса и четыре метода, не считая их перегрузок, и может быть включен в другой проект простым копированием исходников, если не нет желания добавлять еще одну зависимость. Это может быть очень кстати в случае простых проектов. Так же LightFactory может быть полезным в проектах, в которых создание объектов требует повышенного внимания с точки зрения производительности.

Использовать фреймворк очень просто. Для начала, надо создать производный от FactoryBase класс и в методе InitFactory зарегистрировать, назовем их так, генераторы объектов (делегаты, которые будут создавать объекты):

    class SamplerFactory : FactoryBase
    {
        public override void InitFactory()
        {
            Define<IList<string>, List<string>>();
            Define<ICollection<int>, int[]>(arr => new List<int>(arr));
        }
    }


Генераторы объектов из одной только операции создания объекта (т.е. которые просто создают и возвращают новый объект) — это только самый простой вариант использования. Пользователь полностью определяет логику создания объекта, а так же какие параметры принимают генераторы и как они их обрабатывают. Например, можно в генераторах добавить логирование, отслеживание создания объектов, контролировать количество создаваемых экземпляров, регистрировать объекты где угодно, постить в твиттер и т.д.

Следующим шагом будет регистрация фабрики:

    public static void Main()
    {
        FactoryBase.RegisterFactory(new SamplerFactory());
    }


Примечание: Библиотека не потокобезопасна, так что при регистрации фабрики надо самому следить за синхронизацией.

Теперь можно создавать объекты с помощью статического метода Factory<>.Create():

    public static void Test()
    {
        ICollection colletion = Factory<ICollection>.Create(new int[] { 1, 2, 3 });
    }


Если при вызове Factory.Create(…) соответствующий генератор объектов не был задан, то просто возвращается default(T)

Вот собственно и все.

По материалам Хабрахабр.



загрузка...

Комментарии:

Наверх