C# 简单注入器显式属性注入-构造函数内的属性为null

C# 简单注入器显式属性注入-构造函数内的属性为null,c#,dependency-injection,attributes,simple-injector,reactiveui,C#,Dependency Injection,Attributes,Simple Injector,Reactiveui,新的简单喷油器,试图让一些作品的原型工作。我正在创建一个WPF应用程序,它使用简单的Injector和ReactiveUI,但似乎无法通过属性来触发显式的属性注入。我正在处理的具体示例只是测试记录器的注入。计划是将其应用到decorator中,但我在以前的projects/DI库中遇到了属性注入的需求。我只是想验证一下我是否能够使用它 引导过程的片段: private Container RegisterDependencies(Container container = null) {

新的简单喷油器,试图让一些作品的原型工作。我正在创建一个WPF应用程序,它使用简单的Injector和ReactiveUI,但似乎无法通过属性来触发显式的属性注入。我正在处理的具体示例只是测试记录器的注入。计划是将其应用到decorator中,但我在以前的projects/DI库中遇到了属性注入的需求。我只是想验证一下我是否能够使用它

引导过程的片段:

private Container RegisterDependencies(Container container = null)
{
    container ??= new Container();

    // Container initialization that must precede dependency registration
    // occurs here

    // Enable property injection via the [Import] attribute
    container.Options.PropertySelectionBehavior =
        new ImportPropertySelectionBehavior();

    SimpleInjectorInitializer initializer = new SimpleInjectorInitializer();
    Locator.SetLocator(initializer);

    Locator.CurrentMutable.InitializeSplat();
    Locator.CurrentMutable.InitializeReactiveUI();

    container.UseSimpleInjectorDependencyResolver(initializer);

    container.RegisterConditional(
        typeof(ILogger),
        c => typeof(NLogLogger<>)
            .MakeGenericType(c.Consumer.ImplementationType),
        Lifestyle.Singleton,
        c => true);
        
    container.Register<MainWindow>();

    container.Register<ISystem, System>(Lifestyle.Singleton);
            
    container.Verify();
    return container;
}
这是系统中的属性注入:

公共类系统:ISystem
{
[导入]公共ILogger记录器{get;set;}
公共系统()
{
//记录器在此为null。引发NullReferenceException
Logger.LogInfo(“创建系统”);
}
}
此时在构造函数中,
Logger
属性为null,尝试记录失败,出现异常。我应该提到,
ILogger
是我自己对NLog的抽象。如果我改为执行构造函数注入:

公共系统(ILogger记录器)
Simple Injector利用这一点解决了依赖性问题。我已尝试将
Import
属性更改为另一个自定义的
Dependency
属性,没有更改。我们还尝试将记录器实例化为一个单独的、相同的行为

真的很感谢你的建议,我在搜索论坛、SimpleInjector/ReactiveUI文档和Steven的DI书籍上都快用完了

编辑-以下是PropertySelectionBehavior代码:

公共类PropertySelectionBehavior:IPropertySelectionBehavior
其中T:Attribute
{
公共布尔选择属性(
类型实现类型,PropertyInfo PropertyInfo)=>
propertyInfo.GetCustomAttributes(typeof(T)).Any();
}
公共类ImportPropertySelectionBehavior:
PropertySelectionBehavior{}
第二次编辑-我可以删除所有与ReactiveUI相关的初始化,并且仍然复制相同的行为。新示例如下所示:

private Container RegisterDependencies(Container Container=null)
{
容器???=新容器();
container.Options.PropertySelectionBehavior=
新建ImportPropertySelectionBehavior();
//记录器注册
容器注册表条件(
类型(ILogger),
c=>typeof(NLogLogger)
.MakeGenericType(c.Consumer.ImplementationType),
生活方式,单身,
c=>true);
//用户界面注册
container.Register();
//container.Register();
容器。登记(生活方式。单身);
container.Verify();
返回容器;
}

更新,显式属性注入工作正常。它发生在建筑之后。我想这是有设计原因的,尽管不知何故,这与我的心理模型相反,即财产注入将按需/首次使用执行

计划进行更多的实验,看看在解决属性依赖关系的时间安排上有什么控制。如果任何更有经验的人对此有任何建议,或者可以向我指出其他文档,我将非常欢迎。decorator听起来像是一种更优雅的方法,可以确保记录器按预期可用,并允许独立延迟加载decoratee关注点。这里有一些讨论:


您正在从
系统的构造函数内部使用
记录器
属性。但是,属性仅在构造函数完成后初始化。如果你从方程中去掉简单的注入器,回到普通的旧C#,你会看到同样的结果。例如:

var系统=新系统()//
var system = container.GetInstance<ISystem>();