2017-12-01 11 views
1

このように、私は、実行するためのアルゴリズムを持っている:このインタフェースのニーズのimplemention動的データとNInject複雑注入

public interface IContainer 
{ 
    int Size(); 
} 

public interface IAlgorithm 
{ 
    void Run(); 
} 

それはこのようになります​​インターフェースに依存UIから取得したデータ

public class Container : IContainer 
{ 
    private readonly List<int> _data; 

    public Container(IEnumerable<int> data) 
    { 
     _data = new List<int>(data); 
    } 

    public int Size() 
    { 
     return _data.Count; 
    } 
} 

次に、IAlgorithmの実装はl IKEこの:

public class Algorithm : IAlgorithm 
{ 
    private readonly IContainer _container; 

    public Algorithm(IContainer container) 
    { 
     _container = container; 
    } 

    public void Run() 
    { 
     Console.WriteLine(_container.Size()); 
    } 
} 

は、私はそれがNInject(私はViewModelにのコンストラクタのパラメータとして使用することができます)を介して注射だように、このインターフェイスを実装します。

public interface IAlgorithmFactory 
{ 
    IAlgorithm Create(IEnumerable<int> data); 
} 

問題がある:私はAlgorithm工事中Kernelから​​の右のインスタンスを取得できるようにする必要があります。実際の状況では、アルゴリズムの依存グラフは非常に大きく、データから作成する必要があるものは1つもありませんが、これらのことは他のものの依存関係です。

私のソリューションは、データから作成する必要があるすべてのクラスにInitializeというメソッドがあることです。他のメソッドを使用する前に、呼び出し側はこれらのセリフを初期化する必要があります。それは悪い習慣のように聞こえる。

実際、私が話している実際のコードはhereです。今はすべてがシングルトンとして注入されています。

NInject経由でこれらのものを注入する他の方法はありますか?

注:すでにこの質問hereをデザインの観点から尋ねました。私はこれがNInjectソリューションに関する具体的な答えを得る良い場所だと思います。

答えて

1

だけNinjectの設定を使用することにより、あなたはこの方法でそれを行うことができます。

 var kernel = new StandardKernel(); 
     kernel.Bind<IContainer>() 
      .To<Container>() 
      .WithConstructorArgument("data", 
       ctx => ctx.Request.ParentContext.Parameters 
        .Single(x => x.Name == "data") 
        .GetValue(ctx, null)); 
     kernel.Bind<IAlgorithm>().To<Algorithm>(); 
     kernel.Bind<IAlgorithmFactory>().ToFactory(); 

     var factory = kernel.Get<IAlgorithmFactory>(); 
     var algorithm = factory.Create(new List<int>() { 1 }); 

はここdata parmeterは、ファクトリメソッドのパラメータから採取しContainerコンストラクタに渡されます。

関連する問題