저는 번역을 사용하는 작은 응용 프로그램 (당분간)이 있습니다. 번역 서비스 (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 + "\">");
}
.
관련성이 있습니다. http://stackoverflow.com/questions/7656195/can-you-inject-dependencies-into-a-constructor-of-a-custom-webviewpage-using-an – StriplingWarrior
@StriplingWarrior ' 주입 특성을 가진 예제를 보았습니다.그러나 간단한 주사기는 그들을 제공하지 않습니다 –
당신이 받고있는 예외의 전체 스택 추적을 저희에게 제공해주십시오. – Steven