C# 4.0 Ninject,将构造函数参数传递给内核
我的问题是: 每次从内核请求一个实例时,我都希望将其中一个值传递给构造函数。我在下面编写了一些代码来说明这个问题。测试没有失败,所以我想这是可行的,但看起来确实很难看。有没有更好、更干净的方法用Ninject实现这一点?还是我应该重新考虑我的设计?欢迎所有建议C# 4.0 Ninject,将构造函数参数传递给内核,c#-4.0,dependency-injection,ninject-2,C# 4.0,Dependency Injection,Ninject 2,我的问题是: 每次从内核请求一个实例时,我都希望将其中一个值传递给构造函数。我在下面编写了一些代码来说明这个问题。测试没有失败,所以我想这是可行的,但看起来确实很难看。有没有更好、更干净的方法用Ninject实现这一点?还是我应该重新考虑我的设计?欢迎所有建议 [TestFixture] public class Sandbox { [Test] public void Run_Forrest_Run() { using (var kernel = new
[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);
});
}
}
}
[TestFixture]
公共类沙箱
{
[测试]
公共无效运行\u Forrest\u运行()
{
使用(var-kernel=new-StandardKernel(new-Module()))
{
var connection=新连接(Guid.NewGuid().ToString());
var downloader=kernel.Get(新的IPParameter[]{new Parameter(“connection”,connection,false)});
Assert.That(downloader.Connection.Info,Is.EqualTo(Connection.Info));
}
}
公共类下载程序:IDownloader
{
公共下载程序(连接,ILogger记录器)
{
连接=连接;
记录器=记录器;
}
公共连接{get;private set;}
公开下载
{
Logger.Log(“下载…”);
}
公共ILogger记录器{get;private set;}
}
公共接口IDownloader
{
连接{get;}
无效下载();
}
公共类控制台记录器:ILogger
{
公共作废日志(字符串消息)
{
控制台输出写入线(消息);
}
}
公共接口ILogger
{
无效日志(字符串消息);
}
公共类连接
{
公共连接(字符串信息)
{
信息=信息;
}
公共字符串信息{get;private set;}
}
公共类模块:Ninject模块
{
公共覆盖无效负载()
{
绑定()到();
将()绑定到()上
.WithConstructorArgument(“连接”,上下文=>
{
var p=context.Parameters.First(x=>x.Name==“connection”);
返回p.GetValue(上下文,null);
});
}
}
}
如果您在解析IDownloader
时总是想指定连接,那么我认为构造函数参数
(它是I参数
)就是您要寻找的:
[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>();
}
}
[测试]
公共无效运行\u Forrest\u运行()
{
使用(var-kernel=new-StandardKernel(new-Module()))
{
var connection=新连接(Guid.NewGuid().ToString());
var downloader=kernel.Get(新[]{
新的构造函数参数(“连接”,连接)};
Assert.That(downloader.Connection.Info,Is.EqualTo(Connection.Info));
}
}
公共类模块:Ninject模块
{
公共覆盖无效负载()
{
绑定()到();
绑定()到();
}
}