mój kod będzie odwoływać Microsoft Jedności, ale jestem pewien, że to jest dość zastosowanie do wszystkich ram DI. Jeśli używasz DI poprawnie nigdy nie musisz wywoływać nowego BusinessObject (new dataContext), stowarzyszenie DI poradzi sobie z tym wszystkim.
Mój przykład będzie trochę dłuższy, ponieważ wkleję w nim kod, którego używam do uruchamiania witryny z podglądem modelu w pełni DI załadowanej przez Unity. (Jeśli chcesz w pełni źródło sprawdzeniu mojego bloga i pobrać go z mojego serwera Assembla SVN)
Załaduj pojemnik (może być w kodzie jak wolę lub za pomocą konfiguracji)
protected void Application_Start(object sender, EventArgs e)
{
Application.GetContainer()
// presenters/controllers are per request
.RegisterType<IEmployeeController, EmployeeController>(new ContextLifetimeManager<IEmployeeController>())
//Data Providers are Per session
.RegisterType<IEmployeeDataProvider, EmployeeDataProvider>(new SessionLifetimeManager<IEmployeeDataProvider>())
//Session Factory is life time
.RegisterType<INHibernateSessionManager, NHibernateSessionManager>(new ContainerControlledLifetimeManager());
}
klienta HTTP połączenia modułu Metoda Unity BuildUp dla każdej strony podczas wywołania OnPreRequest.
private static void OnPreRequestHandlerExecute(object sender, EventArgs e)
{
var handler = HttpContext.Current.Handler;
HttpContext.Current.Application.GetContainer().BuildUp(handler.GetType(), handler);
// User Controls are ready to be built up after the page initialization is complete
var page = HttpContext.Current.Handler as Page;
if (page != null)
{
page.InitComplete += OnPageInitComplete;
}
}
pojemnik Page prezenter ozdobione [Zależność] przypisują
public partial class Employees : Page, IEmployeeView
{
private EmployeePresenter _presenter;
[Dependency]
public EmployeePresenter Presenter
{
set
{
_presenter = value;
_presenter.View = this;
}
}
}
Presenter metodą InjectionConstructor
public class EmployeePresenter : Presenter<IEmployeeView>
{
private readonly IEmployeeController _controller;
[InjectionConstructor]
}
public EmployeePresenter(IEmployeeController controller)
{
_controller = controller;
}
Controller następuje garnitur
public class EmployeeController : IEmployeeController
{
private readonly IEmployeeDataProvider _provider;
[InjectionConstructor]
public EmployeeController(IEmployeeDataProvider DataProvider)
{
_provider = DataProvider;
}
}
samo z pro vider
public class EmployeeController : IEmployeeController
{
private readonly IEmployeeDataProvider _provider;
[InjectionConstructor]
public EmployeeController(IEmployeeDataProvider DataProvider)
{
_provider = DataProvider;
}
}
Wreszcie menedżer sesji, który zawiera tylko zwykłego konstruktora.
public class NHibernateSessionManager : INHibernateSessionManager
{
private readonly ISessionFactory _sessionFactory;
public NHibernateSessionManager()
{
_sessionFactory = GetSessionFactory();
}
}
Więc co się dzieje, gdy żądanie strony jest uruchamiany gromadzeniu metoda() jest wywoływana na stronie przez HttpModule. Unity następnie widzi właściwość oznaczoną atrybutem Dependency i sprawdzi kontener, aby sprawdzić, czy w środku istnieje obiekt EmployeePresenter.
Ponieważ nie ma takiego obiektu w pojemniku, wówczas spróbuje utworzyć EmployeePresenter. Po sprawdzeniu, aby utworzyć klasę, którą widzi wewnątrz prezentera, wymaga konstruktora, który potrzebuje wtryskiwanego IEmployeeController. Ponieważ kontener faktycznie ma menedżera dla kontrolera, zobaczy, czy jego instancja istnieje w kontenerze, który na początku żądania strony nie istnieje, a więc przejdzie do utworzenia instancji kontrolera.
Unity zobaczy, że kontroler wymaga wtryskiwacza IEmployeeDataProvider i będzie kontynuował ten proces, aż w końcu dotrze do punktu, w którym dostawca potrzebuje wstrzykniętego menedżera sesji. Ponieważ menedżer sesji nie potrzebuje już wtrysku, Unity utworzy instancję menedżera sesji, zapisze go w kontenerze, podając ContainerLifeTimeManager, wstrzyknie go do dostawcy i zapisze to wystąpienie, i tak dalej, aż do zakończenia tworzenia Zależność EmployeePresenter dla strony.
Cóż, jeśli używasz bezpośrednio słowa kluczowego "nowy" zamiast żądać obiektu, w którym nie używasz wtrysku zależności. –
@Pop, myślisz o strukturze DI, a nie DI wzorca. W DI wzorzec, wstrzyknięcie instancji klasy, od której jesteś zależny w konstruktorze, jest całkowicie uzasadnione. Innym sposobem jest zrobienie tego za pośrednictwem właściwości. – tvanfosson
@Pop Catalin - To jest przykład DI. Instancja obiektu, który ma być wstrzyknięty, to "IDataContext", a nie "BusinessProducts". – Owen