2012-02-16 8 views
6

Đây là vấn đề của tôi: Tôi muốn chuyển một trong các giá trị cho hàm tạo mỗi khi tôi yêu cầu một mẫu thể hiện hạt nhân. Tôi đã viết một số mã dưới đây để minh họa vấn đề. Bài kiểm tra không phải là thất bại vì vậy tôi đoán rằng điều này hoạt động, nhưng nó trông khá xấu xí. Có cách nào tốt hơn, sạch hơn để thực hiện điều này với Ninject không? Hay tôi nên suy nghĩ lại về thiết kế của mình? Tất cả các đề xuất đều được đánh giá cao.Ninject, chuyển đối số hàm tạo cho hạt nhân

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

Trả lời

13

Nếu bạn luôn muốn xác định Connection khi giải quyết một IDownloader sau đó tôi nghĩ rằng ConstructorArgument (mà là một IParameter) là những gì bạn đang tìm kiếm:

[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

Một tốt đẹp! Hoạt động tốt, cảm ơn bạn đã giúp đỡ! – Pelle