2012-02-16 10 views
6

पर कन्स्ट्रक्टर तर्क गुजर रहा है यहां मेरी समस्या है: जब भी मैं कर्नेल के उदाहरण का अनुरोध करता हूं तो मैं कन्स्ट्रक्टर को मानों में से किसी एक में पास करना चाहता हूं। मैंने समस्या को स्पष्ट करने के लिए नीचे कुछ कोड लिखा है। परीक्षण विफल नहीं हो रहा है इसलिए मुझे लगता है कि यह काम करता है, लेकिन यह बहुत बदसूरत लग रहा है। क्या निनजेक्ट के साथ इसे पूरा करने के लिए एक बेहतर, साफ तरीका है? या मुझे अपने डिजाइन पर पुनर्विचार करना चाहिए? सभी सुझावों की सराहना की जाती है।निंजा, कर्नेल

[TestFixture] 
public class Sandbox 
{ 
    [Test] 
    public void Run_Forrest_Run() 
    { 
     using (var kernel = new StandardKernel(new Module())) 
     { 
      var connection = new Connection(Guid.NewGuid().ToString()); 
      var downloader = kernel.Get<IDownloader>(new IParameter[] { new Parameter("connection", connection, false) }); 

      Assert.That(downloader.Connection.Info, Is.EqualTo(connection.Info)); 
     } 
    } 

    public class Downloader : IDownloader 
    { 
     public Downloader(Connection connection, ILogger logger) 
     { 
      Connection = connection; 
      Logger = logger; 
     } 

     public Connection Connection { get; private set; } 

     public void Download() 
     { 
      Logger.Log("Downloading..."); 
     } 

     public ILogger Logger { get; private set; } 
    } 

    public interface IDownloader 
    { 
     Connection Connection { get; } 
     void Download(); 
    } 

    public class ConsoleLogger : ILogger 
    { 
     public void Log(string message) 
     { 
      Console.Out.WriteLine(message); 
     } 
    } 

    public interface ILogger 
    { 
     void Log(string message); 
    } 

    public class Connection 
    { 
     public Connection(string info) 
     { 
      Info = info; 
     } 

     public string Info { get; private set; } 
    } 

    public class Module : NinjectModule 
    { 
     public override void Load() 
     { 
      Bind<ILogger>().To<ConsoleLogger>(); 

      Bind<IDownloader>().To<Downloader>() 
       .WithConstructorArgument("connection", context => 
       { 
        var p = context.Parameters.First(x => x.Name == "connection"); 
        return p.GetValue(context, null); 
       }); 
      } 
    } 
} 

उत्तर

13

आप हमेशा जब एक IDownloader को हल करने Connection निर्दिष्ट करने के लिए चाहते हैं, तो मुझे लगता है कि ConstructorArgument (जो एक IParameter है) है कि आप क्या देख रहे हैं:

[Test] 
public void Run_Forrest_Run() 
{ 
    using (var kernel = new StandardKernel(new Module())) 
    { 
     var connection = new Connection(Guid.NewGuid().ToString()); 
     var downloader = kernel.Get<IDownloader>(new [] { 
      new ConstructorArgument("connection", connection) }); 

     Assert.That(downloader.Connection.Info, Is.EqualTo(connection.Info)); 
    } 
} 

public class Module : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<ILogger>().To<ConsoleLogger>(); 
     Bind<IDownloader>().To<Downloader>(); 
    } 
} 
+0

एक अच्छा! महान काम करता है, मदद करने के लिए धन्यवाद! – Pelle

संबंधित मुद्दे