2012-02-16 13 views
6

İşte benim sorunum: Çekirdeğe örnek oluşturduğum her seferinde, yapıcıya değerlerden birini aktarmak istiyorum. Sorunu göstermek için aşağıda bir kod yazdım. Test başarısız değil, bu yüzden bu işe yarıyor, ama oldukça çirkin görünüyor. Bunu Ninject ile başarmanın daha iyi, daha temiz bir yolu var mı? Yoksa tasarımımı yeniden düşünmeli miyim? Tüm öneriler takdir edilmektedir.Ninject, çekirdek için kurucu argümanını geçen

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

cevap

13

her zaman IDownloader çözümlerken Connection belirtmek istiyorsanız o zaman aradığınızı (a IParameter olan) ConstructorArgument düşünüyorum:

[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

Güzel! Harika çalışıyor, yardım ettiğin için teşekkürler! – Pelle