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
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;
}
}
}
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ę.
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 |
www.facebook.com/PictOgr-1729700930654225 | |
twitter.com/gemu_gocom | |
RSS | http://mrdev.pl/category/daj-sie-poznac-2017/feed |