asp.net 웹 양식에서 Ninject 또는 DI를 구현하려면 어떻게 해야 합니까?
MVC 애플리케이션에서 작동한 예는 많이 있습니다.웹 양식에서 어떻게 수행됩니까?
다음은 웹 양식과 함께 Ninject를 사용하는 단계입니다.
1단계 - 다운로드
필요한 다운로드는 Ninject-2.0.0-release-net-3.5와 WebForm 확장 Ninject 두 가지입니다.Web_1.0.0.0_With.log4net(NLog 대안 있음).
웹 응용 프로그램에서 다음 파일을 참조해야 합니다.주입구.dll, 주입구.웹.dll, 나인젝트.내선 번호.Logging.dll 및 Ninject.내선 번호.로깅.Log4net.dll.
2단계 - 전역.asax
는 글벌클다파합음생니야다어되서에에서 파생되어야 합니다.Ninject.Web.NinjectHttpApplication
을 구현합니다.CreateKernel()
컨테이너를 생성합니다.
using Ninject; using Ninject.Web;
namespace Company.Web {
public class Global : NinjectHttpApplication
protected override IKernel CreateKernel()
{
IKernel kernel = new StandardKernel(new YourWebModule());
return kernel;
}
그StandardKernel
는 생성자가사니다합을 합니다.Module
.
3단계 - 모듈
이 모(이)YourWebModule
프로그램에합니다. " " " " " " " " " " " " "
using Ninject;
using Ninject.Web;
namespace Company.Web
{
public class YourWebModule : Ninject.Modules.NinjectModule
{
public override void Load()
{
Bind<ICustomerRepository>().To<CustomerRepository>();
}
예에서, , 디어▁the든, 어디든,ICustomerRepository
인터페이스는 콘크리트를 참조합니다.CustomerRepository
사용됩니다.
4단계 - 페이지
이 작업이 완료되면 각 페이지가 다음에서 상속되어야 합니다.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);
}
그InjectAttribute -[Inject]
에게 Ninject를 .ICustomerRepository
CustomerRepo 속성으로 이동합니다.
이미 기본 페이지가 있는 경우 기본 페이지를 Ninject에서 파생하기만 하면 됩니다.웹.페이지 베이스.
5단계 - 마스터 페이지
필연적으로 마스터 페이지가 있고 마스터 페이지가 주입된 개체에 액세스할 수 있도록 하려면 마스터 페이지를 파생해야 합니다.Ninject.Web.MasterPageBase
:
using Ninject;
using Ninject.Web;
namespace Company.Web
{
public partial class Site : MasterPageBase
{
#region Properties
[Inject]
public IInventoryRepository InventoryRepo { get; set; }
6단계 - 정적 웹 서비스 방법
다음 문제는 정적 메소드에 주입할 수 없다는 것이었습니다.우리는 몇 가지 Ajax 페이지 메소드를 가지고 있었는데, 이 메소드들은 분명히 정적입니다. 그래서 저는 메소드들을 표준 웹 서비스로 옮겨야 했습니다.다시 말하지만, 웹 서비스는 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);
서비스인 자바스크립트를 해야 합니다.Company.Web.Services.YourWebService.GetProductivity(user, onSuccess)
에, 다는보는PageMethods.GetProductivity(user, onSuccess)
.
제가 발견한 유일한 문제는 사용자 컨트롤에 개체를 주입하는 것이었습니다.Ninject 기능을 사용하여 자체 기본 UserControl을 만들 수 있지만 필요한 개체에 대한 사용자 컨트롤에 Property를 추가하고 컨테이너 페이지에서 Property를 설정하는 것이 더 빠르다는 것을 알게 되었습니다.UserControls를 즉시 지원하는 것은 Ninject "할 일" 목록에 있다고 생각합니다.
Ninject를 추가하는 것은 매우 간단하고 설득력 있는 IoC 솔루션입니다.Xml 구성이 없기 때문에 많은 사람들이 좋아합니다.Ninject 구문만으로 객체를 Singleton으로 바꾸는 등 다른 유용한 "트릭"이 있습니다.Bind<ILogger>().To<WebLogger>().InSingletonScope()
웹로거를 실제 싱글톤 구현으로 변경할 필요가 없습니다. 저는 이것이 좋습니다.
Ninject v3.0(2012년 4월 12일 기준)이 출시되면서 더욱 쉬워졌습니다.주입은 HttpModule을 통해 구현되므로 사용자 정의 페이지/마스터 페이지에서 페이지를 상속할 필요가 없습니다.다음은 빠른 스파이크를 위한 단계(및 코드)입니다.
- 새 ASP.NET WebForms 프로젝트 만들기
- NuGet을 사용하여 Ninject를 추가합니다.웹 lib(Ninject도 다운시킬 것입니다.웹.공통 및 Ninject libs)
- App_Start / NinjectWebCommon.cs / 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>();
}
체납
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());
}
}
사이트.마스터
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());
}
}
모델
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";
}
}
출력 창 결과
I am a model 1
From master: I am a model 1
버그가 열려 있어 현재 여기서 답변이 작동하지 않습니다.다음은 고객 http 모듈을 사용하여 inject 클래스에서 상속할 필요 없이 페이지와 컨트롤에 주입하는 @Jason 단계의 수정된 버전입니다.
- 새 ASP.NET WebForms 프로젝트 만들기
- NuGet을 사용하여 Ninject를 추가합니다.웹리브
- App_Start / NinjectWebCommon.cs / RegisterServices 메서드에 사용자 정의 바인딩 등록
- InjectPageModule을 추가하고 InjectWebCommon에 등록합니다.
- 페이지에 속성 주입 사용
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;
}
웹 공통 주입 / 서비스 등록
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IHttpModule>().To<InjectPageModule>();
kernel.Bind<IAmAModel>().To<Model1>();
}
체납
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());
}
}
사이트.마스터
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());
}
}
모델
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";
}
}
출력 창 결과
I am a model 1
From master: I am a model 1
Ninject를 구현하기 위한 단계는 다음과 같습니다.ASP.NET 웹 양식의 웹입니다.
- Global.asax에서 NinjectHttpApplication을 구현합니다.커널의 경우 NinjectModule을 구현하여 전달합니다.
- 각 웹 양식에서 코드 뒤에 있는 페이지 로드 이벤트에서 Ninject를 구현합니다.웹.페이지 베이스.위에 [Inject] 필터가 있는 인스턴스 클래스를 추가합니다.
더 자세한 예를 들어, 다음은 제가 찾은 유용한 링크입니다.
1.http://joeandcode.net/post/Ninject-2-with-WebForms-35
2.http://davidhayden.com/blog/dave/archive/2008/06/20/NinjectDependencyInjectionASPNETWebPagesSample.aspx
스티브 샌더슨(언론)의 "Pro ASP.NET MVC 2 Framework, 2nd Edition" 책을 확인하십시오.작성자는 Ninject를 사용하여 데이터베이스와 연결합니다.저는 당신이 예시들을 사용해서 당신의 필요에 맞게 조정할 수 있다고 생각합니다.
public IGoalsService_CRUD _context { get; set; }
_context 개체가 null로 설정되어 있습니다.다음은 나머지 설정입니다.
public partial class CreateGoal : Page
{
[Inject]
public IGoalsService_CRUD _context { get; set; }
}
글로벌 파일용
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>();
}
}
언급URL : https://stackoverflow.com/questions/4933695/how-can-i-implement-ninject-or-di-on-asp-net-web-forms
'source' 카테고리의 다른 글
도커 생성을 결합하여 DEV Azure 컨테이너 레지스트리에 넣는 방법은 무엇입니까? (0) | 2023.06.11 |
---|---|
판다: 시리즈의 데이터 유형을 문자열로 변경 (0) | 2023.06.11 |
iPhone UI WebView 사용 시 As.Net 양식 (0) | 2023.06.11 |
CLion에서 단일 파일을 생성, 컴파일 및 실행하는 방법 (0) | 2023.06.11 |
파이썬에서 병렬 프로그래밍을 수행하는 방법은 무엇입니까? (0) | 2023.06.11 |