Einfache Injektor-property injection in Aktion filter
Den action filter möchte ich einzuspritzen, beginnt so
public class UserAuthorisation : AuthorizeAttribute
{
public IWcfClientProxy<IAppFrameworkServiceChannel>
FrameworkServiceProxy { get; set; }
Ich habe meine setup-container wie diese:
container.Register<IWcfClientProxy<IAppFrameworkServiceChannel>>(
()=> new WcfClientProxy<IAppFrameworkServiceChannel>());
container.RegisterInitializer<UserAuthorisation>(handler =>
{
handler.FrameworkServiceProxy = container
.GetInstance<IWcfClientProxy<IAppFrameworkServiceChannel>>();
});
Wenn ich diesen starte, die FrameworkServiceProxy
- Eigenschaft ist null.
Habe ich diesen Beitrag gelesen: Einfache Injektor: Injektion einer Eigenschaft in einer Basisklasse und folgte die Antwort. Ich habe auch gelesen Beispiel auf dieser Seite Einfache Injektor-Dokumentation.
Ich bin nicht der Einspeisung in einer Basis-Klasse und vielleicht ist das das Problem?
## UPDATE ##
Ich bin das hinzufügen von mehr Informationen, wie ich denke, es sollte aus dem, was gesagt wurde Stevens Antwort.
Ich bin mit dem NuGet-Paket für MVC 3. Dies fügt die folgenden zur Anwendung:
public static class SimpleInjectorInitializer
{
///<summary>Initialize the container and register it as MVC3 Dependency Resolver.</summary>
public static void Initialize()
{
var container = new Container();
InitializeContainer(container);
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.RegisterMvcAttributeFilterProvider();
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
}
private static void InitializeContainer(Container container)
{
container.Register<IWcfClientProxy<IAppFrameworkServiceChannel>>(() => new WcfClientProxy<IAppFrameworkServiceChannel>());
container.RegisterInitializer<UserAuthorisation>(handler =>
{
handler.FrameworkServiceProxy = container.GetInstance<IWcfClientProxy<IAppFrameworkServiceChannel>>();
});
}
Dies beinhaltet die container.RegisterMvcAttributeFilterProvider();
dass ich, als ich jetzt verstehen, es sollte sich eine filter-Anbieter und sollte bedeuten, dass die Filter erstellt, durch den container (dieses Verständnis könnte falsch sein) und dann Eigenschaften sind automatisch wired-up.
Meinen filter registriert ist, in der Globalen.asax.cs etwa so:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new UserAuthorisation());
}
Scheint es mir, dass der filter nicht erstellt wird, durch den Behälter, so dass ich denke, ich muss etwas anderes tun zu bekommen, dass das passiert ?
- Wie registrieren Sie Ihre
UserAuthorisation
? Tun Sie es hinzufügen, um GlobalFilters oder Einfache Injektor hat eine filterprovider? - Ich habe es über die globalen Filter, ist, dass, wo ich schief gelaufen?
- Ja, es ist das problem. Wenn die
UserAuthorisation
ist nicht gelöst durch Einfache Injektor dann Einfach Injektor nicht wissen, über Ihre Filter also nicht die Eigenschaft der Injektion... - OK cool, willst du das in eine Antwort-vielleicht zeigt ein Beispiel für die einfache Injektor-filter-Anbieter, und ich werde es akzeptieren (auch wenn es funktioniert für mich 🙂 ).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Registrieren Sie einen Initialisierer auf Ihre
UserAuthorisation
Attribut. Initialisierungen sind jedoch nur der container, wenn ein Typ wird erstellt, indem der container selbst. Da Attribute erstellt werden, die von der CLR, die Initialisierung geht nicht aus.Den SimpleInjector.Integration.Web.Mvc.dll (dieses NuGet-Paket) enthält eine
RegisterMvcAttributeFilterProvider
- Erweiterung-Methode. Dies wird registrieren Sie einenAttributeFilterProvider
das tun wird implizite Eigenschaft Injektion (und in den callcontainer.InjectProperties
- Methode). Nach dem Aufrufcontainer.RegisterMvcAttributeFilterProvider()
werden Sie sehen, dass diese Eigenschaft ist automatisch injiziert.Habe ich ausgewählt Stevens Antwort, denn die Antwort, denn es hat mich auf eine Lösung und ich bin jetzt mit der command-handler, die er erwähnt in den Kommentaren.
Habe ich einen einfachen Arbeit rund um meine Globale Filter injiziert.
In der App_Start\SimpleInjectorInitializer.cs habe ich Hinzugefügt
RegisterGlobalFilters
wie diese:Und in der
Initialize
Methode habe ich diesesRegisterGlobalFilters(GlobalFilters.Filters, container);
Die komplette Methode sieht wie folgt aus:
Wie gesagt sehr einfach. Gerade meine Instanzen von einfachen Injektor und fügen Sie dann zu der globalen Liste, ich bin sicher, es gibt bessere Möglichkeiten, dies zu tun.
Diese Weise bedeutet, dass Sie müssen nicht zum ändern der globalen.asax.cs ist möglicherweise eine gute Sache.
RegisterMvcAttributeFilterProvider
ist nun obsolet und ersetzt durchRegisterMvcIntegratedFilterProvider
: simpleinjector.readthedocs.org/en/latest/...