Có rất nhiều ví dụ để làm cho nó hoạt động trên ứng dụng MVC. Nó được thực hiện như thế nào trên Web Forms?
Có rất nhiều ví dụ để làm cho nó hoạt động trên ứng dụng MVC. Nó được thực hiện như thế nào trên Web Forms?
Câu trả lời:
Dưới đây là các bước để sử dụng Ninject với WebForms.
Bước1 - Tải xuống
Có hai bản tải xuống bắt buộc - Ninject-2.0.0.0-release-net-3.5 và các phần mở rộng WebForm Ninject.Web_1.0.0.0_With.log4net (có một thay thế NLog).
Các tệp sau cần được tham chiếu trong ứng dụng web: Ninject.dll, Ninject.Web.dll, Ninject.Extensions.Logging.dll và Ninject.Extensions.Logging.Log4net.dll.
Bước 2 - Global.asax
Lớp Global cần lấy từ Ninject.Web.NinjectHttpApplication
và triển khai CreateKernel()
, lớp này tạo ra vùng chứa:
using Ninject; using Ninject.Web;
namespace Company.Web {
public class Global : NinjectHttpApplication
protected override IKernel CreateKernel()
{
IKernel kernel = new StandardKernel(new YourWebModule());
return kernel;
}
Hàm StandardKernel
tạo nhận a Module
.
Bước 3 - Mô-đun
Trong trường hợp này, Mô-đun YourWebModule
xác định tất cả các ràng buộc mà ứng dụng web sẽ cần:
using Ninject;
using Ninject.Web;
namespace Company.Web
{
public class YourWebModule : Ninject.Modules.NinjectModule
{
public override void Load()
{
Bind<ICustomerRepository>().To<CustomerRepository>();
}
Trong ví dụ này, bất cứ nơi nào ICustomerRepository
giao diện được tham chiếu, bê tông CustomerRepository
sẽ được sử dụng.
Bước 4 - Trang
Sau khi hoàn tất, mỗi trang cần kế thừa từ Ninject.Web.PageBase
:
using Ninject;
using Ninject.Web;
namespace Company.Web
{
public partial class Default : PageBase
{
[Inject]
public ICustomerRepository CustomerRepo { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
Customer customer = CustomerRepo.GetCustomerFor(int customerID);
}
Các InjectAttribute -[Inject]
- kể Ninject để bơm ICustomerRepository
vào tài sản CustomerRepo.
Nếu bạn đã có trang cơ sở, bạn chỉ cần lấy trang cơ sở của mình để lấy từ Ninject.Web.PageBase.
Bước 5 - Trang chính
Chắc chắn, bạn sẽ có các trang chính và để cho phép một Trang chủ truy cập các đối tượng được chèn vào, bạn sẽ cần lấy trang chính của mình từ Ninject.Web.MasterPageBase
:
using Ninject;
using Ninject.Web;
namespace Company.Web
{
public partial class Site : MasterPageBase
{
#region Properties
[Inject]
public IInventoryRepository InventoryRepo { get; set; }
Bước 6 - Phương thức dịch vụ web tĩnh
Vấn đề tiếp theo là không thể đưa vào các phương thức tĩnh. Chúng tôi đã có một vài Ajax PageMethods, rõ ràng là tĩnh, vì vậy tôi phải chuyển các phương thức này vào một dịch vụ web tiêu chuẩn. Một lần nữa, dịch vụ web cần bắt nguồn từ lớp Ninject - Ninject.Web.WebServiceBase
:
using Ninject;
using Ninject.Web;
namespace Company.Web.Services
{
[WebService(Namespace = "//tempuri.org/">http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class YourWebService : WebServiceBase
{
#region Properties
[Inject]
public ICountbackRepository CountbackRepo { get; set; }
#endregion
[WebMethod]
public Productivity GetProductivity(int userID)
{
CountbackService _countbackService =
new CountbackService(CountbackRepo, ListRepo, LoggerRepo);
Trong JavaScript của mình, bạn sẽ cần tham chiếu đến dịch vụ chuẩn - Company.Web.Services.YourWebService.GetProductivity(user, onSuccess)
thay vì tham chiếu PageMethods.GetProductivity(user, onSuccess)
.
Vấn đề duy nhất khác mà tôi tìm thấy là đưa các đối tượng vào User Controls. Mặc dù có thể tạo UserControl cơ sở của riêng bạn với các khả năng Ninject, nhưng tôi thấy việc thêm Thuộc tính vào quyền điều khiển của người dùng cho đối tượng được yêu cầu và đặt Thuộc tính trong trang vùng chứa sẽ nhanh hơn. Tôi nghĩ rằng hỗ trợ UserControls ra khỏi hộp nằm trong danh sách "việc cần làm" của Ninject.
Thêm Ninject khá đơn giản và nó là một giải pháp IoC hùng hồn. Nhiều người thích nó vì không có cấu hình Xml. Nó có những "thủ thuật" hữu ích khác như biến các đối tượng thành các Singleton chỉ với cú pháp Ninject - Bind<ILogger>().To<WebLogger>().InSingletonScope()
. Không cần phải thay đổi WebLogger thành một cấy ghép Singleton thực tế, tôi thích điều này.
Nó trở nên dễ dàng hơn với việc phát hành Ninject v3.0 (kể từ ngày 4/12/2012). Injection được triển khai thông qua HttpModule nên không cần các trang của bạn kế thừa từ một Trang / MasterPage tùy chỉnh. Dưới đây là các bước (và mã) để tăng đột biến nhanh chóng.
NinjectWebCommon / RegisterServices
/// <summary>
/// Load your modules or register your services here!
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IAmAModel>().To<Model1>();
}
Mặc định
public partial class _Default : System.Web.UI.Page
{
[Inject]
public IAmAModel Model { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
System.Diagnostics.Trace.WriteLine(Model.ExecuteOperation());
}
}
Site.Master
public partial class SiteMaster : System.Web.UI.MasterPage
{
[Inject]
public IAmAModel Model { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
System.Diagnostics.Trace.WriteLine("From master: "
+ Model.ExecuteOperation());
}
}
Mô hình
public interface IAmAModel
{
string ExecuteOperation();
}
public class Model1 : IAmAModel
{
public string ExecuteOperation()
{
return "I am a model 1";
}
}
public class Model2 : IAmAModel
{
public string ExecuteOperation()
{
return "I am a model 2";
}
}
Kết quả từ cửa sổ đầu ra
I am a model 1
From master: I am a model 1
NinjectWeb.cs
trong App_Start
. Mã của bạn để khởi tạo Ninject phải có trong tệp này. Nếu nó nằm trong một tệp riêng (ví dụ: NinjectWebCommon.cs
nó sẽ không hoạt động). Điều này có thể xảy ra nếu bạn cài đặt Ninject.Web muộn hơn các gói Ninject khác sử dụng NuGet.
Câu trả lời ở đây hiện không hoạt động do một lỗi mở . Đây là phiên bản sửa đổi của các bước của @ Jason bằng cách sử dụng httpmodule của khách hàng để đưa vào các trang và điều khiển mà không cần kế thừa từ các lớp ninject.
InjectPageModule.cs
public class InjectPageModule : DisposableObject, IHttpModule
{
public InjectPageModule(Func<IKernel> lazyKernel)
{
this.lazyKernel = lazyKernel;
}
public void Init(HttpApplication context)
{
this.lazyKernel().Inject(context);
context.PreRequestHandlerExecute += OnPreRequestHandlerExecute;
}
private void OnPreRequestHandlerExecute(object sender, EventArgs e)
{
var currentPage = HttpContext.Current.Handler as Page;
if (currentPage != null)
{
currentPage.InitComplete += OnPageInitComplete;
}
}
private void OnPageInitComplete(object sender, EventArgs e)
{
var currentPage = (Page)sender;
this.lazyKernel().Inject(currentPage);
this.lazyKernel().Inject(currentPage.Master);
foreach (Control c in GetControlTree(currentPage))
{
this.lazyKernel().Inject(c);
}
}
private IEnumerable<Control> GetControlTree(Control root)
{
foreach (Control child in root.Controls)
{
yield return child;
foreach (Control c in GetControlTree(child))
{
yield return c;
}
}
}
private readonly Func<IKernel> lazyKernel;
}
NinjectWebCommon / RegisterServices
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IHttpModule>().To<InjectPageModule>();
kernel.Bind<IAmAModel>().To<Model1>();
}
Mặc định
public partial class _Default : System.Web.UI.Page
{
[Inject]
public IAmAModel Model { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
System.Diagnostics.Trace.WriteLine(Model.ExecuteOperation());
}
}
Site.Master
public partial class SiteMaster : System.Web.UI.MasterPage
{
[Inject]
public IAmAModel Model { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
System.Diagnostics.Trace.WriteLine("From master: "
+ Model.ExecuteOperation());
}
}
Mô hình
public interface IAmAModel
{
string ExecuteOperation();
}
public class Model1 : IAmAModel
{
public string ExecuteOperation()
{
return "I am a model 1";
}
}
public class Model2 : IAmAModel
{
public string ExecuteOperation()
{
return "I am a model 2";
}
}
Kết quả từ cửa sổ đầu ra
I am a model 1
From master: I am a model 1
if (currentPage.Master!=null) { this.lazyKernel().Inject(currentPage.Master); }
Tôi nghĩ đây là các bước để triển khai Ninject.Web trên ASP.NET Web Forms.
Để có ví dụ chi tiết hơn, dưới đây là một số liên kết hữu ích mà tôi tìm thấy:
Hãy xem phần mở rộng Ninject.Web. Nó cung cấp cơ sở hạ tầng cơ sở https://github.com/ninject/ninject.web
Kiểm tra cuốn sách "Pro ASP.NET MVC 2 Framework, 2nd Edition" của Steve Sanderson (Apress). Tác giả sử dụng Ninject để kết nối với cơ sở dữ liệu. Tôi nghĩ bạn có thể sử dụng các ví dụ và điều chỉnh chúng theo nhu cầu của bạn.
public IGoalsService_CRUD _context { get; set; }
Đối tượng _context đang được đặt thành null bằng cách nào đó. Sau đây là phần còn lại của cài đặt
public partial class CreateGoal : Page
{
[Inject]
public IGoalsService_CRUD _context { get; set; }
}
Đối với tệp chung
protected override IKernel CreateKernel()
{
IKernel kernel = new StandardKernel(new Bindings());
return kernel;
}
public class Bindings : NinjectModule
{
public override void Load()
{
Bind<goalsetterEntities>().To<goalsetterEntities>();
Bind<IGoalsService_CRUD>().To<GoalsService_CRUD>();
}
}