将接口注入 Viewmodel 为空

Injecting interface intoViewmodel is null

我对DryIoc的了解有限,希望有人能帮助我。 在我的移动应用程序中,我正在读取一个包含我所有设置的 json 文件

我只想将相关设置注入相关视图模型。

基本上如何将我填充的 ​​object/interface 注入视图模型的构造函数

以下是目前失败的 noddy 测试和示例。

我可以设置 viewmodel 的 属性 但我希望接口不为 null 当调用视图模型构造函数时。

希望一切顺利。非常感谢!!

using NUnit.Framework;
using DryIoc;

namespace DryIocTests
{
    [TestFixture]
    public class TestClass
    {
        private IAppSettings appSettings;
        [OneTimeSetUp]
        public void Setup()
        {
            //pretend we have read a json file in our mobile app
             appSettings = new AppSettings
            {
                CloudSettings = new CloudSettings {TestPropertyTwo = "Two"}
            };
        }

        [Test]
        public void ThisWorksButIsNotWhatIWant()
        {
            using (var container = new Container())
            {
                container.Register<ICloudSettings, CloudSettings>();
                container.Register<ICloudSampleViewModel, CloudSampleViewModel>();

                var vm = container.Resolve<ICloudSampleViewModel>();
                //I know that setting the property like that will work
                //but I do not want to do that .I wanted to find a way that by the time the viewModel is resolved the interface got values
                vm.CloudSettings = appSettings.CloudSettings;

                Assert.IsNotNull(vm.CloudSettings);
                Assert.IsNotNull(vm.CloudSettings.TestPropertyTwo);
            }
        }
        [Test]
        public void HowDoIMakeThisToWork()
        {
            using (var container = new Container())
            {
                container.Register<ICloudSettings, CloudSettings>();
                container.Register<ICloudSampleViewModel, CloudSampleViewModel>();

                var cloudSettings = container.Resolve<ICloudSettings>();
                cloudSettings.TestPropertyTwo = appSettings.CloudSettings.TestPropertyTwo;

                container.UseInstance(typeof(ICloudSettings));

                //by now I want that myviewmodel has the injected interface ICloudSetting populated.
                var vm = container.Resolve<ICloudSampleViewModel>();

                Assert.IsNotNull(vm.CloudSettings.TestPropertyTwo);
            }
        }
    }

    public class CloudSampleViewModel :ICloudSampleViewModel
    {
        public CloudSampleViewModel(ICloudSettings cloudSettings)
        {
            CloudSettings = cloudSettings;
        }

        public ICloudSettings CloudSettings { get; set; }
    }
    public class AppSettings : IAppSettings
    {
        public CloudSettings CloudSettings { get; set; }
    }
    public class CloudSettings: ICloudSettings{public string TestPropertyTwo { get; set; }}
    public interface IAppSettings
    {
        CloudSettings CloudSettings { get; set; }
    }

    public interface ICloudSettings{string TestPropertyTwo { get; set; }}
    public interface ICloudSampleViewModel{ICloudSettings CloudSettings { get; set; }}
}

这里是live working example

完整代码如下。搜索 FIX! 以查看实际修复。

using System;
using DryIoc;

public class Program
{
    public static void Main()
    {
        var p = new Program();

        p.Setup();

        p.ThisWorksButIsNotWhatIWant();

        p.HowDoIMakeThisToWork();
    }

    private IAppSettings appSettings;

    public void Setup()
    {
        //pretend we have read a json file in our mobile app
        appSettings = new AppSettings
        {
            CloudSettings = new CloudSettings {TestPropertyTwo = "Two"}
        };
    }

    public void ThisWorksButIsNotWhatIWant()
    {
        using (var container = new Container())
        {
            container.Register<ICloudSettings, CloudSettings>(
                made: PropertiesAndFields.Of.Name("TestPropertyTwo", _ => appSettings.CloudSettings.TestPropertyTwo)); // FIX!

            container.Register<ICloudSampleViewModel, CloudSampleViewModel>();

            var vm = container.Resolve<ICloudSampleViewModel>();

            Console.WriteLine("vm.CloudSettings: " + vm.CloudSettings);
            Console.WriteLine("vm.CloudSettings.TestPropertyTwo: " + vm.CloudSettings.TestPropertyTwo);
        }
    }

    public void HowDoIMakeThisToWork()
    {
        using (var container = new Container())
        {
            container.Register<ICloudSettings, CloudSettings>();
            container.Register<ICloudSampleViewModel, CloudSampleViewModel>();

            var cloudSettings = container.Resolve<ICloudSettings>();
            cloudSettings.TestPropertyTwo = appSettings.CloudSettings.TestPropertyTwo;

            container.UseInstance(cloudSettings); // FIX!

            //by now I want that myviewmodel has the injected interface ICloudSetting populated.
            var vm = container.Resolve<ICloudSampleViewModel>();

            Console.WriteLine("vm.CloudSettings.TestPropertyTwo: " + vm.CloudSettings.TestPropertyTwo);
        }
    }
}

public class CloudSampleViewModel :ICloudSampleViewModel
{
    public CloudSampleViewModel(ICloudSettings cloudSettings)
    {
        CloudSettings = cloudSettings;
    }

    public ICloudSettings CloudSettings { get; set; }
}

public class AppSettings : IAppSettings
{
    public CloudSettings CloudSettings { get; set; }
}

public class CloudSettings: ICloudSettings{ public string TestPropertyTwo { get; set; }}
public interface IAppSettings
{
    CloudSettings CloudSettings { get; set; }
}

public interface ICloudSettings{string TestPropertyTwo { get; set; }}
public interface ICloudSampleViewModel{ICloudSettings CloudSettings { get; set; }}