在使用Unity构造方法用于物业依赖注入(Property Dependency Injection

2019-09-18 07:17发布

好吧,我有一个基类中定义的依赖性,我想用它它的派生类的构造函数里面,但不工作时,属性显示为空。 统一解决从属属性AFTER解决与container.Resolve)的实例(;

一种替代我是一个IUnityContainer参数添加到我的MyViewModel类的构造函数,并设置ILogger属性我自己喜欢的东西:

public MyViewModel(IUnityContainer container)
{
  Logger = container.Resolve<ILogger>();
}

编辑:通过@Wiktor_Zychla另一个建议是通过一个构造注射参数为:

public MyViewModel(ILogger _logger)
{
    Logger = _logger;
}

这似乎很好地工作,但我会做到这一点对我的所有派生的ViewModels ..

但后来我没有用我的基类中的注释ILogger依赖。 请看下文中我类别的样本。 现在的问题是:哪些选择呢我有,或者我究竟做错了什么?

谢谢!

我有一个ViewModel基类是这样的:

public abstract class ViewModelBase
{
    [Dependency]
    public ILogger Logger { get; set; }
....
}

然后,我有一个类继承的是:

public class MyViewModel : ViewModelBase
{
    public MyViewModel()
    {
         //I want to use my dependent property in constructor, but doesn't 

         Logger.Error("PRINT AN ERROR");
    }
}

而在我的应用程序入口点我登记我的ILogger作为一个单独和我MyViewModel类:

container.RegisterType<ILogger, MyAppLogger>(new ContainerControlledLifetimeManager());
container.RegisterType<MyViewModel>();

Answer 1:

统一解决从属属性AFTER解决与container.Resolve)的实例(;

这是相当明显的,如果你仔细想想吧。 刚刚尝试手动执行此操作。 你不会成功的。 为了能够注入属性,必须有一个实例,有一个实例,是指构造函数被调用。

因为你在你的构造做太多的问题引起的。 从依赖注入的角度来看,一个构造函数应该做的无非就是接受它的依赖(检查它们不为空),并将其存储在私有字段。 做任何事情比这更是一个反模式。 你不应该在你的构造任何逻辑。

在构造具有逻辑使创建对象图不可靠的,而构建的对象图应该是快速和可靠的。

当你遵循这一原则,不会有问题,因为一旦你运行任何业务逻辑,你的类将被完全实例化。 由于构造应该做的无非就是设置私有领域多,没有什么可以去错了,不可能有任何理由骂Logger.Error("PRINT AN ERROR"); 因为你在做什么。



Answer 2:

1)你可以通过简单地丢弃使用在每一个视图模型的记录器的不同实例ContainerControlledLifetimeManager

2)可以注册一个不同Type通过在注册时将其指定为每个视图模型记录仪。

container.RegisterType<ILogger, MyAppLogger>();
container.RegisterType<ILogger, MyOtherLogger>("uniqueNameOfAnILoggerRegistration);
container.RegisterType<MyViewModel>(new InjectionConstructor(
    new ResolvedParameter(typeof(ILogger), "uniqueNameOfAnILoggerRegistration")));

使用构造器注入您的视图模型将与一个全新的实例注入MyOtherLogger

物业注射应保留“最好有”的价值观和你的类明显依赖于一个记录器,我会强烈建议使用构造函数注射的存在。



文章来源: Property Dependency Injection used in Constructor using Unity