2

ここに欠けている明らかな何かがあるように感じます。ninject を使用してクラスを作成しようとしています。このクラスは、HttpContext の Session に格納されている単一の文字列パラメーターを受け入れます。そのパラメーターをこのクラスに渡すにはどうすればよいですか?

クラスは次のようになります。

public class Manager : IManager
{
    public Manager(string a) { ... }
}

次のようなカスタム依存関係リゾルバーがあります。

public class NinjectDependencyResolver : IDependencyResolver
{
    IKernel kernel;
    public NinjectDependencyResolver()
    {
        kernel = new StandardKernel();
        Bind<IManager>().To<Manager>()
    }

    ...
}

典型的なコントローラーは次のようになります。

public class ManagerController : Controller
{
    public ManagerController(IManager manager) { ... }
}
4

4 に答える 4

4

パラメータがセッションに格納されることは、関連する実装の詳細であり、Ninject 構成には属しません。

IManagerConfigurationマネージャーの各構成値のプロパティを持つインターフェイスと、そのインターフェイスのセッション ストア実装を作成する必要があります。これで、単純なバインドを追加して、文字列の代わりにインターフェースをマネージャー コンストラクターに渡すことができます。

于 2012-07-27T07:48:44.657 に答える
1

UPDATE:

Session can't be accessed at the initial time please check the @James answer below.

Did you try using WithConstructorArgument.

public class NinjectDependencyResolver : IDependencyResolver
{
    IKernel kernel;
    public NinjectDependencyResolver()
    {
        kernel = new StandardKernel();
        Bind<IManager>()
           .To<Manager>()
           .WithConstructorArgument("a", ..)
    }

    ...
}
于 2012-07-27T04:10:28.073 に答える
0

Manager パラメータを文字列から に変更できる場合は、Func<string>WithConstructorArgument と Func of () => HttpContext.Current.Session["foo"].ToString() を使用できます。

それができない場合は、代わりに、その文字列パラメーターを受け取る Create メソッドを IManagerFactory に挿入します。独自のファクトリを作成して手動で行うこともできますが、ToFactory には ninject 拡張機能を使用します。

https://github.com/ninject/ninject.extensions.factory/wiki/Factory-interface

于 2012-07-27T06:34:07.547 に答える
0

これを試して

            var copyToNew = new ConstructorArgument("isCopyToNew", IsCopyToNew);
            IParameter[] pars = new Parameter[] {  copyToNew };
            var anyViewModel = IoC.Kernel.Get<IAnyViewModel>(pars);

また

var anyViewModel=IoC.Kernel.Get<IAnyViewModel>(new ConstructorArgument("isCopyToNew",IsCopyToNew));
于 2012-07-27T04:01:44.083 に答える