Vous pouvez utiliser l'injection automatique de constructeur en remplaçant la valeur par défaut PageHandlerFactory
par une valeur personnalisée. De cette façon, vous pouvez utiliser un constructeur surchargé pour charger les dépendances. Votre page peut ressembler à ceci:
public partial class HomePage : System.Web.UI.Page
{
private readonly IDependency dependency;
public HomePage(IDependency dependency)
{
this.dependency = dependency;
}
// Do note this protected ctor. You need it for this to work.
protected HomePage() { }
}
Configuration personnalisée que PageHandlerFactory
peut être fait dans le web.config comme suit:
<?xml version="1.0"?>
<configuration>
<system.web>
<httpHandlers>
<add verb="*" path="*.aspx"
type="YourApp.CustomPageHandlerFactory, YourApp"/>
</httpHandlers>
</system.web>
</configuration>
Votre CustomPageHandlerFactory
peut ressembler à ceci:
public class CustomPageHandlerFactory : PageHandlerFactory
{
private static object GetInstance(Type type)
{
// TODO: Get instance using your favorite DI library.
// for instance using the Common Service Locator:
return Microsoft.Practices.ServiceLocation
.ServiceLocator.Current.GetInstance(type);
}
public override IHttpHandler GetHandler(HttpContext cxt,
string type, string vPath, string path)
{
var page = base.GetHandler(cxt, type, vPath, path);
if (page != null)
{
// Magic happens here ;-)
InjectDependencies(page);
}
return page;
}
private static void InjectDependencies(object page)
{
Type pageType = page.GetType().BaseType;
var ctor = GetInjectableCtor(pageType);
if (ctor != null)
{
object[] arguments = (
from parameter in ctor.GetParameters()
select GetInstance(parameter.ParameterType)
.ToArray();
ctor.Invoke(page, arguments);
}
}
private static ConstructorInfo GetInjectableCtor(
Type type)
{
var overloadedPublicConstructors = (
from constructor in type.GetConstructors()
where constructor.GetParameters().Length > 0
select constructor).ToArray();
if (overloadedPublicConstructors.Length == 0)
{
return null;
}
if (overloadedPublicConstructors.Length == 1)
{
return overloadedPublicConstructors[0];
}
throw new Exception(string.Format(
"The type {0} has multiple public " +
"ctors and can't be initialized.", type));
}
}
Inconvénient est que cela ne fonctionne que lorsque vous exécutez votre côté en confiance totale. Vous pouvez en savoir plus à ce sujet here. Mais notez que le développement d'applications ASP.NET en confiance partielle seems a lost cause.
Salut Steven, j'ai quelque chose comme ça implémenté dans mon projet et ça marche vraiment bien. Mais je suis confronté à un problème maintenant. Il est décrit ici "http://stackoverflow.com/questions/15692499/page-routing-in-asp-net-4-0-extensionless-url-versus-pagehandlerfactory-asp". Pourriez-vous s'il vous plaît jeter un oeil et peut-être partager une opinion? –
Château Windsor. Peu importe, je l'ai résolu en résolvant de Boostrapper dans les pages. Ce n'est pas cool, mais bon, ça marche et ça a l'air bien. –
J'ai trouvé cet excellent article http://www.codemag.com/Article/1210031 (je pense lié d'une autre réponse SO, mais maintenant je ne peux pas trouver lequel) qui comprend plus d'exemple de code lié à la solution ci-dessus, et De plus, il est intéressant de noter que Microsoft MEaged Extensibility Framework (MEF) peut vous aider à résoudre ce problème d'injection de dépendance et d'autres similaires de manière très utile et légèrement non standard. –