将接口注入 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; }}
}
完整代码如下。搜索 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; }}
我对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; }}
}
完整代码如下。搜索 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; }}