2009-08-13 3 views
4

В настоящее время я использую ASP.NET (стандарт, не MVC), и я использую Ninject в качестве контейнера IOC.Ninject, ASP.NET и настраиваемые элементы управления

Я уже использую его, чтобы придать зависимостей в моих страниц, однако, мне было интересно, если есть способ, чтобы придать зависимостей в мои пользовательские элементы управления?

Если нет, то я сдвинуться расширение Ninject :)

ответ

6

Хорошо, так что я в конечном итоге расширения Ninject и добавил два класса в DLL Ninject.Framework.Web.

Heres патч для тех, кто заинтересован в добавлении его сами:

Index: src/Framework/Web/Ninject.Framework.Web.csproj 
=================================================================== 
--- src/Framework/Web/Ninject.Framework.Web.csproj (revision 158) 
+++ src/Framework/Web/Ninject.Framework.Web.csproj (working copy) 
@@ -2,7 +2,7 @@ 
    <PropertyGroup> 
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> 
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> 
- <ProductVersion>9.0.21022</ProductVersion> 
+ <ProductVersion>9.0.30729</ProductVersion> 
    <SchemaVersion>2.0</SchemaVersion> 
    <ProjectGuid>{C46075DB-A0FB-466B-BA76-C093227FA9C7}</ProjectGuid> 
    <OutputType>Library</OutputType> 
@@ -42,17 +42,24 @@ 
    <Reference Include="System.Core"> 
     <RequiredTargetFramework>3.5</RequiredTargetFramework> 
    </Reference> 
+ <Reference Include="System.Data" /> 
+ <Reference Include="System.Drawing" /> 
    <Reference Include="System.Web" /> 
    <Reference Include="System.Web.Services" /> 
+ <Reference Include="System.Xml" /> 
    </ItemGroup> 
    <ItemGroup> 
    <Compile Include="..\..\GlobalAssemblyInfo.cs"> 
     <Link>Properties\GlobalAssemblyInfo.cs</Link> 
    </Compile> 
+ <Compile Include="WebControlBase.cs" /> 
    <Compile Include="NinjectHttpApplication.cs" /> 
    <Compile Include="HttpHandlerBase.cs"> 
    </Compile> 
    <Compile Include="NinjectHttpModule.cs" /> 
+ <Compile Include="UserControlBase.cs"> 
+  <SubType>ASPXCodeBehind</SubType> 
+ </Compile> 
    <Compile Include="WebServiceBase.cs"> 
     <SubType>Component</SubType> 
    </Compile> 
Index: src/Framework/Web/UserControlBase.cs 
=================================================================== 
--- src/Framework/Web/UserControlBase.cs (revision 0) 
+++ src/Framework/Web/UserControlBase.cs (revision 0) 
@@ -0,0 +1,65 @@ 
+#region License 
+// 
+// Author: Nate Kohari <[email protected]>, Nik Radford <[email protected]> 
+// Copyright (c) 2007-2008, Enkari, Ltd. 
+// 
+// Licensed under the Apache License, Version 2.0 (the "License"); 
+// you may not use this file except in compliance with the License. 
+// You may obtain a copy of the License at 
+// 
+// http://www.apache.org/licenses/LICENSE-2.0 
+// 
+// Unless required by applicable law or agreed to in writing, software 
+// distributed under the License is distributed on an "AS IS" BASIS, 
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+// See the License for the specific language governing permissions and 
+// limitations under the License. 
+// 
+#endregion 
+#region Using Directives 
+using System; 
+using Ninject.Core.Logging; 
+using Ninject.Core; 
+using System.Web.UI; 
+#endregion 
+ 
+namespace Ninject.Framework.Web 
+{ 
+ /// <summary> 
+ /// A <see cref="UserControl"/> that supports injection 
+ /// </summary> 
+ public class UserControlBase : UserControl 
+ { 
+  /*----------------------------------------------------------------------------------------*/ 
+  private ILogger _logger; 
+  /*----------------------------------------------------------------------------------------*/ 
+  /// <summary> 
+  /// Gets or sets the logger associated with the object. 
+  /// </summary> 
+  [Inject] 
+  public ILogger Logger 
+  { 
+   get { return _logger; } 
+   set { _logger = value; } 
+  } 
+  /*----------------------------------------------------------------------------------------*/ 
+  /// <summary> 
+  /// Raises the <see cref="E:System.Web.UI.Control.Init"></see> event to initialize the page. 
+  /// </summary> 
+  /// <param name="e">An <see cref="T:System.EventArgs"></see> that contains the event data.</param> 
+  protected override void OnInit(EventArgs e) 
+  { 
+   base.OnInit(e); 
+   RequestActivation(); 
+  } 
+  /*----------------------------------------------------------------------------------------*/ 
+  /// <summary> 
+  /// Asks the kernel to inject this instance. 
+  /// </summary> 
+  protected virtual void RequestActivation() 
+  { 
+   KernelContainer.Inject(this); 
+  } 
+  /*----------------------------------------------------------------------------------------*/ 
+ } 
+} 
Index: src/Framework/Web/WebControlBase.cs 
=================================================================== 
--- src/Framework/Web/WebControlBase.cs (revision 0) 
+++ src/Framework/Web/WebControlBase.cs (revision 0) 
@@ -0,0 +1,65 @@ 
+#region License 
+// 
+// Author: Nate Kohari <[email protected]>, Nik Radford <[email protected]> 
+// Copyright (c) 2007-2008, Enkari, Ltd. 
+// 
+// Licensed under the Apache License, Version 2.0 (the "License"); 
+// you may not use this file except in compliance with the License. 
+// You may obtain a copy of the License at 
+// 
+// http://www.apache.org/licenses/LICENSE-2.0 
+// 
+// Unless required by applicable law or agreed to in writing, software 
+// distributed under the License is distributed on an "AS IS" BASIS, 
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
+// See the License for the specific language governing permissions and 
+// limitations under the License. 
+// 
+#endregion 
+#region Using Directives 
+using System; 
+using System.Web.UI.WebControls; 
+using Ninject.Core.Logging; 
+using Ninject.Core; 
+#endregion 
+ 
+namespace Ninject.Framework.Web 
+{ 
+ /// <summary> 
+ /// A <see cref="WebControl"/> that supports injection 
+ /// </summary> 
+ public class WebControlBase : WebControl 
+ { 
+  /*----------------------------------------------------------------------------------------*/ 
+  ILogger _logger; 
+  /*----------------------------------------------------------------------------------------*/ 
+  /// <summary> 
+  /// Gets or sets the logger associated with the object. 
+  /// </summary> 
+  [Inject] 
+  public ILogger Logger 
+  { 
+   get { return _logger; } 
+   set { _logger = value; } 
+  } 
+  /*----------------------------------------------------------------------------------------*/ 
+  /// <summary> 
+  /// Raises the <see cref="E:System.Web.UI.Control.Init"></see> event to initialize the page. 
+  /// </summary> 
+  /// <param name="e">An <see cref="T:System.EventArgs"></see> that contains the event data.</param> 
+  protected override void OnInit(EventArgs e) 
+  { 
+   base.OnInit(e); 
+   RequestActivation(); 
+  } 
+  /*----------------------------------------------------------------------------------------*/ 
+  /// <summary> 
+  /// Asks the kernel to inject this instance 
+  /// </summary> 
+  protected virtual void RequestActivation() 
+  { 
+   KernelContainer.Inject(this); 
+  } 
+  /*----------------------------------------------------------------------------------------*/ 
+ } 
+} 
+0

Можете ли вы по крайней мере отправлять необработанный XML вместо форматированный вещи вы получили сюда IE? –

+0

Это патч SVN для Ninject, который добавляет возможность использования Ninject с элементами управления пользователя и пользовательскими элементами управления в ASP.NET. – Sekhat

+0

Это действительно сработало! Спасибо! – Seiti

0

Я решил это цикл через все элементы управления на странице, а также инъекционные тех, кто реализует некоторый интерфейс.

Интерфейс пуст:

public interface INinjectControl { } 

Я добавил петлю к PageBase и MasterPageBase внедрить все элементы управления, которые реализуют этот интерфейс:

protected virtual void RequestActivation() 
{ 
    KernelContainer.Inject(this); 
    InjectControls(this.Controls); 
} 

private void InjectControls(ControlCollection controls) 
{ 
    foreach (Control control in controls) 
    { 
     if (control is INinjectControl) 
      KernelContainer.Inject(control); 
     this.InjectControls(control.Controls); 
    } 
} 

Есть некоторые недостатки:

  • Это работает только для элементов управления, которые уже находятся на странице, когда OnInit пожаров. Если вы добавите элемент управления позже в этот процесс, цикл уже выполнит , и зависимости не будут введены.
  • Это вызывает CreateChildControls() для некоторых элементов управления, потому что вы запрашиваете коллекцию Controls. Это может привести к проблемам, поскольку этот метод теперь называется намного более ранним в жизненном цикле.
  • Он проходит через все элементы управления, поэтому он не очень эффективен.