Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 Ninject,将构造函数参数传递给内核_C# 4.0_Dependency Injection_Ninject 2 - Fatal编程技术网

C# 4.0 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

我的问题是: 每次从内核请求一个实例时,我都希望将其中一个值传递给构造函数。我在下面编写了一些代码来说明这个问题。测试没有失败,所以我想这是可行的,但看起来确实很难看。有没有更好、更干净的方法用Ninject实现这一点?还是我应该重新考虑我的设计?欢迎所有建议

[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模块
{
公共覆盖无效负载()
{
绑定()到();
绑定()到();
}
}