Mã của tôi sẽ tham chiếu Microsoft Unity nhưng tôi chắc chắn mã này khá phù hợp với tất cả các khung DI. Nếu bạn đang sử dụng DI một cách chính xác bạn không bao giờ cần phải gọi BusinessObject mới (new dataContext) hiệp hội DI sẽ xử lý tất cả cho bạn.
Ví dụ của tôi sẽ lâu hơn một chút vì tôi sẽ dán một số mã tôi sử dụng để chạy trang web Trình xem mô hình Xem đầy đủ DI được tải bởi Unity. (Nếu bạn muốn nguồn đầy đủ kiểm tra blog của tôi và tải về từ máy chủ Assembla SVN của tôi)
tải container (có thể trong mã như tôi thích hoặc sử dụng cấu hình)
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());
}
Tuỳ chỉnh HTTP cuộc gọi mô-đun Phương thức xây dựng Unity cho mỗi trang trong lời gọi 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;
}
}
người dẫn chương trình trang chứa trang trí với [Thuộc] thuộc tính
public partial class Employees : Page, IEmployeeView
{
private EmployeePresenter _presenter;
[Dependency]
public EmployeePresenter Presenter
{
set
{
_presenter = value;
_presenter.View = this;
}
}
}
Presenter với phương pháp InjectionConstructor
public class EmployeePresenter : Presenter<IEmployeeView>
{
private readonly IEmployeeController _controller;
[InjectionConstructor]
}
public EmployeePresenter(IEmployeeController controller)
{
_controller = controller;
}
điều khiển sau phù hợp với
public class EmployeeController : IEmployeeController
{
private readonly IEmployeeDataProvider _provider;
[InjectionConstructor]
public EmployeeController(IEmployeeDataProvider DataProvider)
{
_provider = DataProvider;
}
}
Cùng với pro vider
public class EmployeeController : IEmployeeController
{
private readonly IEmployeeDataProvider _provider;
[InjectionConstructor]
public EmployeeController(IEmployeeDataProvider DataProvider)
{
_provider = DataProvider;
}
}
Cuối cùng, trình quản lý phiên, chỉ chứa một hàm tạo thông thường.
public class NHibernateSessionManager : INHibernateSessionManager
{
private readonly ISessionFactory _sessionFactory;
public NHibernateSessionManager()
{
_sessionFactory = GetSessionFactory();
}
}
Vì vậy, điều xảy ra khi một yêu cầu trang được khởi động phương thức BuildUp() được gọi trên trang HttpModule. Unity sau đó nhìn thấy thuộc tính được đánh dấu bằng thuộc tính Dependency và sẽ kiểm tra nó là container để xem bên trong nó có tồn tại một đối tượng EmployeePresenter hay không.
Vì không có đối tượng như vậy trong vùng chứa, khi đó, nó sẽ cố gắng tạo một EmployeePresenter. Sau khi kiểm tra để tạo ra lớp mà nó nhìn thấy bên trong Trình bày nó yêu cầu một hàm tạo cần một IEmployeeController được tiêm vào nó. Vì thùng chứa thực sự có một trình quản lý cho bộ điều khiển nên nó sẽ thấy nếu một thể hiện của nó tồn tại trong vùng chứa mà trên đầu của yêu cầu trang không tồn tại, vì vậy nó sẽ đi để khởi tạo bộ điều khiển.
Unity sau đó sẽ thấy bộ điều khiển yêu cầu một IEmployeeDataProvider tiêm vào nó, và nó sẽ tiếp tục quá trình này cho đến khi nó cuối cùng đến điểm mà Nhà cung cấp cần trình quản lý phiên được tiêm. Vì trình quản lý phiên không còn cần tiêm Unity thì sẽ tạo một thể hiện của trình quản lý phiên lưu trữ nó trong thùng chứa cho nó được đưa vào ContainerLifeTimeManager, đưa nó vào trong Nhà cung cấp và lưu trữ cá thể đó, và cứ thế xuống đến nơi nó đã tạo xong Phụ thuộc EmployeePresenter cho trang.
Vâng, nếu bạn đang sử dụng từ khóa "mới" trực tiếp thay vì yêu cầu đối tượng bạn không sử dụng tiêm phụ thuộc. –
@Pop, bạn đang nghĩ đến một khung DI, chứ không phải là DI. Trong DI mẫu, việc tiêm một thể hiện của lớp mà bạn phụ thuộc vào trong một hàm tạo là hoàn toàn hợp lý. Một cách khác là làm điều đó thông qua các thuộc tính. – tvanfosson
@Pop Catalin - Đây là ví dụ về DI. Ví dụ của đối tượng được tiêm là "IDataContext" không phải là "BusinessProducts". – Owen