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

と使用方法:

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

しかし、私は作成した場合:

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

アプリケーションを実行するときしかし、私は次のエラーをしました2番目のコンストラクタ、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) 

編集2

@StriplingWarriorと@Stevenは、しかし、それはない、私はプロパティインジェクションを使用し、示唆したようにWebViewPage

で作業しているようです

私はそれをサービスでテストし、Property Injectionは成功しましたが、このクラスではプロパティはnullとなります。

PS:プロパティをget; setで公開しました。

新しいビューページ:

私は 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()...) { } 

をしかし、私はそれをお勧めしません...最高のもの、それは、この依存関係の解決ロジックが働いて持っているということ:

また、このようなパラメータなしのコンストラクタを作成することができます。

関連する問題