我如何使用内核创建一个对象.获取具有特定属性的绑定

本文关键字:属性 绑定 获取 何使用 内核 创建 一个对象 | 更新日期: 2023-09-27 18:15:02

对于我正在编写的测试,我想创建一个带有ninject的对象,该对象使用属性进行分类。例:我能通过这次考试吗?

using Ninject;
using NUnit.Framework;
using System;
namespace TestProject
{
    public class RedAttribute : Attribute { }
    public class BlueAttribute : Attribute { }
    public class TestClass
    {
        public string Str;
        public TestClass([Blue] String str)
        {
            Str = str;
        }
    }
    [TestFixture]
    public class SimpleTest
    {
        [Test]
        public void TestFunction()
        {
            IKernel kernel = new StandardKernel();
            kernel.Bind<string>()
                .ToMethod(context => "Red String")
                .WhenTargetHas<RedAttribute>();
            kernel.Bind<string>()
                .ToMethod(context => "Blue String")
                .WhenTargetHas<BlueAttribute>();
            kernel.Bind<TestClass>().ToSelf();
            // this works fine
            TestClass testC = kernel.Get<TestClass>();
            Assert.That(testC.Str, Is.EqualTo("Blue String"));
            // but I can't get the below to work
            // Ideally I would like something statically typed, eg
            // string str = kernel.Get<string, BlueAttribute>();
            string str = "TODO ?????";
            Assert.That(str, Is.EqualTo("Blue String"));
        }
    }
}

我如何使用内核创建一个对象.获取具有特定属性的绑定

代码kernel.Get<string, BlueAttribute>();将变得相当复杂。你可以这样写

var request = new Request(
    null,
    typeof (string),
    new ParameterTarget(
        "get method/constructor by reflection",
        "get parameter info of parameter with [Blue attribute]"),
    x => (object)null);
string str = kernel.Resolve(request).OfType<string>().Single();

你也可以创建一个动态类型,而不是编写一个,并使用反射来获取构造函数/参数信息。或者你可以使用IL发射来创建一个。

但是我认为创建一个假类更简单。实际上你不需要kernel.Bind<TestClass>().ToSelf();,因为它是一个可实例化的类,ninject可以在没有绑定的情况下解析它。