Kontener DI - kolekcje

24.05.2017

Kolekcje w kontrolerze Dependency Injection - Autofac W zmaganiach z kontenerem AutoFac, natrafiłem na możliwość wstrzykiwania całych kolekcji implementujących ten sam interfejs.

Dzięki takiemu podejściu udało mi się znacznie uprościć kod algorytmu. Niniejszym dzielę się swoimi spostrzeżeniami oraz przykładową poglądową implementacją rozwiązania jakie zastosowałem.

Interfejs

Bardzo prosty interfejs IOnlyForTest zawierający szkielet metody Calc przyjmującej dwa parametry a i b, następnie zwracający wynik operacji.

Interfejs wykorzystywany w kolekcji.

1
2
3
4
5
6
7
8
using System;
namespace Test
{
    public interface IOnlyForTest
    {
        int Calc(int a, Int b);
    }
}

Klasa implementująca IOnlyForTest zostanie automatycznie wstrzyknięta jako jeden z elementów kolekcji.

Rejestrowanie klas w module kontenera AutoFac

Moduł rejestrowania klas implementujących interfejs IOnlyForTest.

Rejestrowanie klas obiektów implementujących interfejs IOnlyForTest.

1
2
3
4
5
6
7
8
9
10
11
namespace Test
{
    public class TestModule : Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            builder.RegisterType<AddOnlyForTest>().AsImplementedInterfaces();
            builder.RegisterType<SubdOnlyForTest>().AsImplementedInterfaces();
        }
    }
}

Można by tutaj powiedzieć, iż własnie budowane są kolejne elementy kolekcji jaka zostanie wstrzyknięta do docelowego obiektu.

Przykładowe klasy implementujące interfejs

Kolekcje w kontrolerze Dependency Injection - Autofac

Pierwsza z klas zwraca wynik dodawania liczby a i b;

Implementacja interfejsu IOnlyForTest, wynikiem jest dodawanie dwóch liczb a i b.

1
2
3
4
5
6
7
8
9
10
11
12
using System;

namespace Test
{
    public class AddOnlyForTest : IOnlyForTest
    {
        public int Calc(int a, Int b)
        {
            return a + b;
        }
    }
}

Druga funkcjonuje analogicznie z tym, iż zwraca różnicę.

Implementacja interfejsu IOnlyForTest, wynikiem jest odejmowanie dwóch liczb a i b.

1
2
3
4
5
6
7
8
9
10
11
12
using System;

namespace Test
{
    public class SubOnlyForTest : IOnlyForTest
    {
        public int Calc(int a, Int b)
        {
            return a - b;
        }
    }
}

Kolekcje w kontrolerze Dependency Injection - Autofac

Obie są rejestrowane przez moduł kontenera AutoFac.

Użycie wstrzykiwania kolekcji

Na koniec pozostaje implementacja klasy TestEnumerable. To właśnie w niej zostanie wstrzyknięta kolekcja zawierająca listę zarejestrowanych klas implementujących IOnlyForTest.

Użycie DI + enumeracji do wyliczeń.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;
using System.Collections.Generic;

namespace Test
{
    public class TestEnumerable
    {
        private readonly IEnumerable<IOnlyForTest> _testEnumerableList;

        public TestEnumerable(IEnumerable<IOnlyForTest> testEnumerableList)                
        {
            _testEnumerableList = testEnumerableList;

            RunTest(DateTime.MinValue, DateTime.MaxValue);
        }

        public void RunTest(DateTime from, DateTime to)
        {
            var a = 1;
            var b = 1;
            var result = 0;

            foreach (var testEnumerable in _testEnumerableList)
            {
                result += testEnumerable.Calc(a, b);
            }           
        }
    }
}

Koniec

Niniejszy kod nie przedstawia żadnej logicznej implementacji, jest to tylko przykład testowy. Głównym jego założeniem jest przedstawienie sposobu łączenia klas implementujących ten sam interfejs w kolekcję. I następnie użycie ich w pętli.

Mam nadzieję, iż ten wirtualny przykład znajdzie zadowolonego odbiorcę.


Daj Się Poznać 2017

Jest to post przygotowany na potrzeby konkursu „Daj Się Poznać 2017” organizowanym przez Macieja Aniserowicza.

Blog https://mrdev.pl
Projekt https://mrdev.pl/pictogr-pomysl
GitHub github.com/krzysztofowsiany/pictogr
Snapchat www.snapchat.com/add/gocom7
Facebook www.facebook.com/PictOgr-1729700930654225
Twitter twitter.com/gemu_gocom
RSS http://mrdev.pl/category/daj-sie-poznac-2017/feed

Zapisz się na listę :)