3

私は依存性注入を使用するのは非常に初めてで、WPFアプリケーションのNinjectで試してみています。クラス間でパラメータをどのように渡す必要があるのか​​疑問に思いました。

例えば

public class ViewPersonViewModel : ViewModelBase
{
    private IDataAccessService _dataService;
    private IPerson _person;
    private string _remarks;

    // binded to textbox
    public string Remarks
    {
        get { return _remarks; }
        set {
            if (_remarks != value) {
                remarks = value;
                OnPropertyChanged("Remarks");
            }
        }   
    }

    public ViewPersonViewModel(
        IDataAccessService dataService, IPerson person)
    {
        _dataService= dataService;
        _person = person;
    }

    // binded to Button
    public void RetrieveStatus()
    {
        Remarks = _dataService.RetrieveRemarks(_person);
    }
}

ここでは、dataServiceは固定クラスであり、おそらく私ができることです。

class Module : Ninject.Modules.NinjectModule 
{
    public override void Load() 
    {
        Bind<IDataAccessService>().To<DefaultDataAccessService>();
    }
}

しかし、呼び出し元のクラスによって設定されるpersonパラメーターをどのように処理する必要があるかを知りたいと思います。

コンストラクターで追加のパラメーターを使用してNinjectを使用してインスタンスを作成することから、コンストラクターで追加のパラメーターを渡すことが可能であることがわかりました。

ただし、いくつか懸念があります。

  1. kernel.Get<MyClass>( With.Parameters.ConstructorArgument( "parameterName", parameterValue) );理想的な方法を使用し ていますか?parameterName間違って入力したときなど、デバッグで多くの問題が発生しませんか?

  2. ルーベンは、プロバイダーが関与するより複雑な方法の使用についても言及しました。ここに適用できますか?もしそうなら、どうすれば使用できますか?

4

2 に答える 2

0

あなたが行うことを検討するかもしれないことは、次のようにコンストラクターをオーバーロードすることです:

public ViewPersonViewModel(IPerson person)
    this(DependencyResolver.GetInstance<IDataAccessService>(), person)
{
}

public ViewPersonViewModel(
    IDataAccessService dataService, IPerson person)
{
    _dataService= dataService;
    _person = person;
}

これの主な欠点は、IoCを介してViewPersonViewModelを直接要求できないことです。

于 2012-06-18T17:10:08.797 に答える
0

Ninject 3 は、クラス間でパラメーターを渡すことができる便利な機能を提供してくれました。のようなインターフェースを作成することによって

public interface IViewPersonViewModelFactory()
{
    IViewPersonViewModel CreateViewPersonViewModel([parameterType parameterName..]);
}

ロードする Ninject モジュールに以下を追加します。

public override void Load()
{
    Bind<IMainControllingViewModelFactory>().ToFactory();
    ... ... //other bindings
}

その後、ViewPersonViewModel クラスのインスタンスを取得できます (たとえば、MainViewModel クラス内)。

 public class MainViewModel
 {
     private IViewPersonViewModel _viewModel;

     public MainViewModel(IViewPersonViewModelFactory viewModelFactory)
     {
         _viewModel = viewModelFactory.CreateViewPersonViewModel(parameters..);
     }
 }

具体的なファクトリを作成する必要がないことに注意してください。

wiki はhttps://github.com/ninject/ninject.extensions.factory/wiki/Factory-interfaceにあります。

于 2012-06-19T01:30:36.783 に答える