Inne odpowiedzi są świetne, ale chciałbym również zwrócić uwagę na to Implementing Dependency Injection using Ninject artykuł.
Jest to jeden z najlepszych artykułów, jakie przeczytałem, co wyjaśnia Dependency Injection i Ninject z bardzo eleganckim przykładem.
Oto fragment z artykułu:
Poniżej interfejsu będą realizowane przez naszego (SMSService) i (MockSMSService), w zasadzie nowy interfejs (ISMSService) narazi te same zachowania zarówno usług jak kod poniżej:
public interface ISMSService
{
void SendSMS(string phoneNumber, string body);
}
(SMSService) wdrażanie do realizacji (ISMSService) interfejs:
public class SMSService : ISMSService
{
public void SendSMS(string mobileNumber, string body)
{
SendSMSUsingGateway(mobileNumber, body);
}
private void SendSMSUsingGateway(string mobileNumber, string body)
{
/*implementation for sending SMS using gateway*/
Console.WriteLine("Sending SMS using gateway to mobile:
{0}. SMS body: {1}", mobileNumber, body);
}
}
(MockSMSService) z zupełnie innej realizacji, używając tego samego interfejsu:
public class MockSMSService :ISMSService
{
public void SendSMS(string phoneNumber, string body)
{
SaveSMSToFile(phoneNumber,body);
}
private void SaveSMSToFile(string mobileNumber, string body)
{
/*implementation for saving SMS to a file*/
Console.WriteLine("Mocking SMS using file to mobile:
{0}. SMS body: {1}", mobileNumber, body);
}
}
musimy wdrożyć zmiany do naszego (UIHandler) Konstruktor klasy zdać uzależnienia przez niego, w ten sposób, kod, który używa (UIHandler) może określić, jakie konkretne wdrażanie (ISMSService) używać:
public class UIHandler
{
private readonly ISMSService _SMSService;
public UIHandler(ISMSService SMSService)
{
_SMSService = SMSService;
}
public void SendConfirmationMsg(string mobileNumber) {
_SMSService.SendSMS(mobileNumber, "Your order has been shipped successfully!");
}
}
teraz musimy utworzyć oddzielną klasę (NinjectBindings), która dziedziczy (NinjectModule). Ta klasa będzie odpowiedzialna za rozwiązywanie zależności w czasie wykonywania, a następnie nadpisamy zdarzenie load, które jest używane do konfigurowania powiązania w nim. Zaletą programu Ninject jest to, że nie musimy zmieniać naszego kodu (ISMSService), (SMSService) i (MockSMSService).
public class NinjectBindings : Ninject.Modules.NinjectModule
{
public override void Load()
{
Bind<ISMSService>().To<MockSMSService>();
}
}
Teraz w UI kodu formularza użyjemy wiązania dla Ninject który zadecyduje których realizacja używać:
class Program
{
static void Main(string[] args)
{
IKernel _Kernal = new StandardKernel();
_Kernal.Load(Assembly.GetExecutingAssembly());
ISMSService _SMSService = _Kernal.Get<ISMSService>();
UIHandler _UIHandler = new UIHandler(_SMSService);
_UIHandler.SendConfirmationMsg("96279544480");
Console.ReadLine();
}
}
Teraz kod jest przy użyciu Ninject Kernal rozwiązać wszystkie łańcuch zależności , jeśli chcemy używać prawdziwej usługi (SMSService) w trybie Release (w środowisku produkcyjnym) zamiast fałszywej, musimy zmienić na klasie wiązania Ninject (NinjectBindings) tylko, aby użyć właściwej implementacji lub używająC#if Dyrektywa DEBUG jak poniżej:
public class NinjectBindings : Ninject.Modules.NinjectModule
{
public override void Load()
{
#if DEBUG
Bind<ISMSService>().To<MockSMSService>();
#else
Bind<ISMSService>().To<SMSService>();
#endif
}
}
Teraz nasza wiążąca klasa (NinjectBindings) utrzymuje się na szczycie całego kodu wykonawczego i możemy łatwo kontrolować konfigurację w jednym miejscu.
Zobacz także What is Inversion of Control? kilka bardzo prostych przykładów wspomniano, aby zrozumieć IoC.
ninject jest strukturą wtrysku zależności. zacznij tutaj: https: // github.com/ninject/ninject/wiki/Dependency-Injection-by-Hand dla dobrego wprowadzenia do koncepcji i używania ninlu – drch
Dokumentacja na wiki wyjaśnia wszystko od podstaw. http://www.ninject.org/wiki.html – spender