Zastanawiałem się trochę nad tym, w jaki sposób zastrzyk zależności mógłby być lepiej zintegrowany bezpośrednio z językiem C #. Wymyśliłem potencjalne rozwiązanie, o którym chciałbym poznać Twoją opinię. Nie używałem wielu struktur wstrzykiwania zależności, więc może być coś, co przeoczam
W każdym razie chodzi o to, aby móc zadeklarować właściwości jako „wstrzykiwalne” za pomocą słowa kluczowego. Kiedy instancja obiektu jest tworzona, a ta właściwość nie jest inicjowana przez konstruktor lub inicjalizator obiektu, żąda instancji tego typu właściwości od jakiejś usługi globalnej.
Podobnie rejestrujesz procedury obsługi różnych typów dla tej usługi, aby można było utworzyć instancję typu wstrzykiwanej właściwości.
Zaletą korzystania z tego rodzaju architektury IMO jest to, że jest dość elastyczna i łatwa w użyciu. Minusem jest to, że za każdym razem, gdy inicjujesz klasę z zastrzykiem, może być pewne obciążenie wywołaniem singletona.
Z drugiej strony jest to problem tylko dla klas, które często są tworzone w rozwiązaniach o wysokiej wydajności, więc nie powinno to stanowić większego problemu. Być może w takich przypadkach możesz użyć jakiejś fabryki.
Myśl, problemy, pytania, lepsze pomysły?
Kod
public class SomeClass
{
public SomeClass()
{
//implicit behavior if Animal is not set in constructor or initializer
this.Animal = GlobalInjector.Get(this,typeof(Mammal))
}
public injectable Mammal Animal
{
get;
set;
}
}
GlobalInjector.Register(typeof(Mammal), () => return new Mammal(someParameter));
Odpowiedzi:
Są rzeczy, które należą do języków, i rzeczy, które nie. Dawno temu C uznał, że IO nie należało do tego języka, ponieważ jest on zewnętrzny w stosunku do modelu obliczeniowego i może być implementowany za pomocą bibliotek funkcji.
Wstrzykiwanie zależności jest właśnie takie. Jest niezależny od języka i można go wdrożyć za pomocą odpowiednich ram.
Jednym z problemów współczesnych języków jest to, że starają się robić za dużo. W końcu te języki upadają pod własnym ciężarem, gdy programiści uciekają do prostszych języków.
źródło
To nie jest potrzebne
Jedną z rzeczy, które najbardziej lubię w najlepszych frameworkach DI, których użyłem, jest to, że kod konfiguracyjny najwyższego poziomu jest jedyną częścią twojego kodu, która musi wiedzieć o DI. Automatyczne okablowanie odbywa się na poziomie kontenera i konfiguracji / „ładowania modułu”, a kod aplikacji może być całkowicie nieświadomy tego.
Oznacza to brak atrybutów, brak ciągów magicznych, brak konwencji. Każdy fragment kodu wie tylko, że akceptuje kod w swoim konstruktorze (/ właściwości / metody) i to wszystko.
Przy takim projekcie nie trzeba wcale zmieniać języka, aby obsługiwać Dependency Injection.
Jest to potencjalnie niebezpieczne
Najbardziej obawiam się, że zintegrowany z językiem system wstrzykiwania zależności polega na tym, że podniósłby on barierę przed jakimkolwiek innym wdrożeniem, ale prawdopodobnie pod pewnymi względami sam by się zamalował.
Oto kilka sposobów, w jakie może się zamalować w kącie:
źródło
Czy widziałeś Managed Extensibility Framework dostarczany z .NET 4? Oto artykuł, który napisałem z kilkoma przykładami. Zasadniczo jest to forma wstrzykiwania zależności wbudowana w .NET, z dodatkowymi funkcjami wykrywania w czasie wykonywania.
Zastrzyki z nieruchomości wyglądają następująco:
Zastrzyki dla konstruktorów wyglądają tak:
Możesz importować pola, importować opcjonalnie, importować kolekcje usług, w tym leniwe importowanie za pomocą metadanych, abyś mógł wyszukać odpowiednią usługę do utworzenia instancji. Możesz nawet ponownie zaimportować w czasie wykonywania, aby wyszukać nowe rozszerzenia.
źródło
źródło