Comment utiliser Château de Windsor avec ASP.Net formulaires web?

Je suis en train de câbler l'injection de dépendance avec les Windsor à la norme asp.net les formulaires web. Je crois que j'ai atteint ce à l'aide d'un HttpModule et un CustomAttribute (code indiqué ci-dessous), bien que la solution me semble un peu maladroit, et je me demandais si il y a une meilleure solution de prise en charge hors de la boîte avec les Windsor?

Il y a plusieurs fichiers tous représentés ici

    //index.aspx.cs
public partial class IndexPage : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
Logger.Write("page loading");
}
[Inject]
public ILogger Logger { get; set; }
}
//WindsorHttpModule.cs
public class WindsorHttpModule : IHttpModule
{
private HttpApplication _application;
private IoCProvider _iocProvider;
public void Init(HttpApplication context)
{
_application = context;
_iocProvider = context as IoCProvider;
if(_iocProvider == null)
{
throw new InvalidOperationException("Application must implement IoCProvider");
}
_application.PreRequestHandlerExecute += InitiateWindsor;
}
private void InitiateWindsor(object sender, System.EventArgs e)
{
Page currentPage = _application.Context.CurrentHandler as Page;
if(currentPage != null)
{
InjectPropertiesOn(currentPage);
currentPage.InitComplete += delegate { InjectUserControls(currentPage); };
}
}
private void InjectUserControls(Control parent)
{
if(parent.Controls != null)
{
foreach (Control control in parent.Controls)
{
if(control is UserControl)
{
InjectPropertiesOn(control);
}
InjectUserControls(control);
}
}
}
private void InjectPropertiesOn(object currentPage)
{
PropertyInfo[] properties = currentPage.GetType().GetProperties();
foreach(PropertyInfo property in properties)
{
object[] attributes = property.GetCustomAttributes(typeof (InjectAttribute), false);
if(attributes != null && attributes.Length > 0)
{
object valueToInject = _iocProvider.Container.Resolve(property.PropertyType);
property.SetValue(currentPage, valueToInject, null);
}
}
}
}
//Global.asax.cs
public class Global : System.Web.HttpApplication, IoCProvider
{
private IWindsorContainer _container;
public override void Init()
{
base.Init();
InitializeIoC();
}
private void InitializeIoC()
{
_container = new WindsorContainer();
_container.AddComponent<ILogger, Logger>();
}
public IWindsorContainer Container
{
get { return _container; }
}
}
public interface IoCProvider
{
IWindsorContainer Container { get; }
}
  • Je voudrais juste dire merci pour le code ci-dessus car il m'a permis de créer un MVP cadre de certains anciens webforms code.
  • Pas un problème Keith.. content que ça pourrait être utile à quelqu'un
  • j'ai essayé ce code, mais il efface le ViewState sur chaque demande. Il semble que si vous accédez à la propriété Controls de la Page en cours avant l'événement de Chargement, ASP.NET est incapable de restaurer l'état d'affichage lors de la LoadViewState étape entre l'Initialisation et de Chargement (voir forums.asp.net/p/1043999/1537884.aspx). Je crois que c'est pourquoi Ayende utilise l'événement Init de base de classes pour la Page d', MasterPage, et UserControl, respectivement, pour résoudre tout Cio dépendances.
  • intéressant.. merci pour la mise à jour. En fait, j'ai été en utilisant la méthode que vous décrivez après les conseils ci-dessous pour regarder igloo.
InformationsquelleAutor Xian | 2008-11-16