2

Ich habe eine kleine Anwendung (für jetzt), die Übersetzungen verwendet. Mein Übersetzungsdienst heißt Übersetzer (ITranslator).Einfacher Injektor - Benutzerdefinierte WebViewPage

Mein Problem ist, dass ich diese Klasse nicht in jedem Controller abrufen möchte (die eine Ansicht zurückgibt), damit ich es in meinen Ansichten verwenden kann.

Ich habe ein ähnliches Problem mit einem ListService (wo ich alle meine SelectListItem Listen speichern).

CustomWebViewPage

public abstract class CustomViewPage<TModel> : WebViewPage<TModel> 
{ 
    readonly IScriptFactory scriptFactory; 
    readonly IMembership membership; 
    readonly IListService listService; 
    readonly ITranslator translator; 

    IHtmlString path; 

    public IMembership Membership { get { return this.membership; } } 
    public override IPrincipal User { get { return this.membership.User; } } 
    public IListService Lists { get { return this.listService; } } 
    public ITranslator Translator { get { return this.translator; } } 

    public CustomViewPage(IScriptFactory scriptFactory, IMembership membership, 
     IListService listService, ITranslator translator) 
    { 
     this.scriptFactory = scriptFactory; 
     this.membership = membership; 
     this.listService = listService; 
     this.translator = translator; 
    } 

    public IHtmlString OwnScriptsPath 
    { 
     get { return path ?? (path = scriptFactory.Create(this.Html).ToHtmlString()); } 
    } 

    private string languageHtml = 
     "<meta name=\"language\" content=\"" + membership.CurrentLanguage + "\">"; 
    public IHtmlString MetaLanguage { get { return MvcHtmlString.Create(languageHtml); } } 
} 

und die Nutzung:

<div> 
    @Lists.GetNationalities(Model.NationalityId) 
</div> 

Wenn jedoch die Ausführung der Anwendung ich folgende Fehlermeldung haben:

'[NAMESPACE].CustomViewPage' does not contain a constructor that takes 0 arguments

Aber wenn ich erstellen 2. Konstruktor, Simple-Injector wird einen Fehler sinc werfen e es unterstützt nicht mehrere Konstruktoren.

Wie kann ich erreichen, was ich will, oder ist das nicht möglich?

bearbeiten

Voll Stack-Trace

c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files\vs\520dfaa2\f5e4578c\App_Web_index.cshtml.a8d08dba.jtlk7fxz.0.cs(40): error CS1729: 'SportsHub.SDK.Infrastructure.CustomViewPage' does not contain a constructor that takes 0 arguments

at System.Web.Compilation.AssemblyBuilder.Compile() 
at System.Web.Compilation.BuildProvidersCompiler.PerformBuild() 
at System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath) 
at System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate) 
at System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile, Boolean throwIfNotFound, Boolean ensureIsUpToDate) 
at System.Web.Compilation.BuildManager.GetVirtualPathObjectFactory(VirtualPath virtualPath, HttpContext context, Boolean allowCrossApp, Boolean throwIfNotFound) at System.Web.Compilation.BuildManager.GetCompiledType(VirtualPath virtualPath) 
at System.Web.Compilation.BuildManager.GetCompiledType(String virtualPath) 
at System.Web.Mvc.BuildManagerWrapper.System.Web.Mvc.IBuildManager.GetCompiledType(String virtualPath) 
at System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) 
at System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) 
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) 
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) 
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) 
at System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) 
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass21.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() 
at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) 

Edit 2

Als @StriplingWarrior und @ Steven vorgeschlagen, benutzte ich Eigenschaft Injektion, aber tut es nicht scheinen zu arbeiten WebViewPage

Ich testete es auf einem Service und Property Injection war erfolgreich, aber in dieser Klasse kommt die Eigenschaft null.

PS: Ich machte die Eigenschaften mit get public;

New View:

public abstract class CustomViewPage<TModel> : WebViewPage<TModel> 
{ 
    [Inject] 
    public IScriptFactory scriptFactory { get; set; } 
    [Inject] 
    public IMembership membership { get; set; } 
    [Inject] 
    public IListService listService { get; set; } 
    [Inject] 
    public ITranslator translator { get; set; } 

    IHtmlString scriptsPath; 
    public IHtmlString OwnScriptsPath() 
    { 
     if (scriptsPath == null) 
     { 
      scriptsPath = scriptFactory.Create(this.Html).ToHtmlString(); 
     } 
     return scriptsPath; 
    } 

    /// <summary> 
    /// Renders the current user language with a meta tag 
    /// </summary> 
    public IHtmlString MetaLanguage() 
    { 
     return MvcHtmlString.Create("<meta name=\"language\" content=\"" + membership.CurrentLanguage + "\">"); 
    } 

Für die InjectAttribute ich folgendes documents befolgt haben.

+0

Dies könnte relevant sein: http://stackoverflow.com/questions/7656195/can-you-inject-dependencies-into-a-constructor-of-a-custom-webviewpage-using-an – StriplingWarrior

+0

@StriplingWarrior I ' Ich habe diese Beispiele mit Injektionsattributen gesehen.Allerdings bietet Simple-Injector keine –

+0

Bitte geben Sie uns die komplette Stack-Trace der Ausnahme, die Sie erhalten. – Steven

Antwort

0

Sie müssen einen Container für die Registerabhängigkeit wie this verwenden. Auf diese Weise können Sie alle Schnittstellen und die entsprechende Implementierung angeben, wenn ASP.NET das SimpleInject aufruft, um die Abhängigkeit aufzulösen.

Sie können auch einen parameterlosen Konstruktor wie folgt erstellen:

public CustomViewPage() : base(new ScriptFactory(), new Membership()...) { } 

Aber ich würde das nicht empfehlen ... das Beste, was es diese Abhängigkeit Analyselogik zu arbeiten zu haben ist.