2

저는 번역을 사용하는 작은 응용 프로그램 (당분간)이 있습니다. 번역 서비스 (Translator (ITranslator))가 번역 서비스입니다.간단한 인젝터 - 사용자 지정 WebViewPage

내 문제는 모든보기 (보기를 반환합니다)에서이 클래스를 검색하지 않으므로 내보기에서 사용할 수 있습니다.

ListService (모든 내 SelectListItem 목록을 저장하는 곳)와 비슷한 문제가 있습니다.

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); } } 
} 

및 사용 : 그러나

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

, 나는 다음과 같은 오류했습니다 응용 프로그램 실행시 :

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

를하지만 만들 경우 두 번째 생성자, Simple-Injector에서 sinc 오류가 발생합니다. 여러 생성자를 지원하지 않습니다.

내가 원하는 것을 어떻게 달성 할 수 있습니까? 아니면 불가능합니까?

편집

전체 스택 추적

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) 

편집 @StriplingWarrior 및 @Steven 제안, 나는 재산 주입 사용

, 그러나 그렇지 않습니다 2 작동중인 것으로 보인다 WebViewPage

서비스에서 속성 테스트를 성공적으로 수행했지만이 클래스의 속성은 null입니다.

추신 : 나는 get; set;으로 속성을 public으로 만들었습니다.

새로운 ViewPage :

나는 documents 다음 다음 한 InjectAttribute를 들어
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 + "\">"); 
    } 

.

+0

관련성이 있습니다. http://stackoverflow.com/questions/7656195/can-you-inject-dependencies-into-a-constructor-of-a-custom-webviewpage-using-an – StriplingWarrior

+0

@StriplingWarrior ' 주입 특성을 가진 예제를 보았습니다.그러나 간단한 주사기는 그들을 제공하지 않습니다 –

+0

당신이 받고있는 예외의 전체 스택 추적을 저희에게 제공해주십시오. – Steven

답변

0

this과 같은 레지스터 종속성 컨테이너를 사용해야합니다. 즉, ASP.NET이 해당 SimpleInject를 호출하여 종속성을 해결할 때 모든 인터페이스와 일치하는 구현을 지정할 수 있습니다.

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

을하지만, 나는 그것을 권하고 싶지 않다 ... 가장 좋은 방법은이 종속성 해상도 논리가 작동 가지고 있다는 :

당신은 또한이 같은 매개 변수가없는 생성자를 만들 수 있습니다.

관련 문제