SimpleInjector懒惰的通用注册

时间:2017-10-17 12:54:18

标签: c# simple-injector

我正在使用一些旧的asp.net Web表单页面并试图让DI工作但遇到一些问题,其中一些对象没有被创建,所以我的目标是在后面的代码中执行一个懒惰的实现。

我在网站的其余部分进行了以下注册:

container.Register(typeof(IDataFactory<,>), new[] { typeof(SqlAccountFactory).Assembly });

为了得到我尝试过的懒惰方面

container.Register<Lazy<IDataFactory<SqlAccountFactory, int>>>(
            () => new Lazy<IDataFactory<SqlAccountFactory, int>>(
                container.GetInstance<IDataFactory<SqlAccountFactory, int>>));

结果是该财产没有填充。

页面后面的代码中的属性(如上所述,这在不使用Lazy时有效):

[Dependency]
public Lazy<IDataFactory<SqlAccountFactory, int>> ProjectCodesRepository;

作为参考,我使用文档中的代码来填充标记有属性的代码隐藏中的属性,并且所有工作都很好地阻止了上面的延迟注册。

有人能够帮助或发现我做过的蠢事吗?

1 个答案:

答案 0 :(得分:1)

Simple Injector IPropertySelectionBehavior仅适用于属性。你定义的是公共领域,而不是财产。如果将其更改为以下内容,则可能会开始工作:

[Dependency]
public Lazy<IDataFactory<SqlAccountFactory, int>> ProjectCodesRepository { get; set; }

明智的做法是将DependencyAttribute标记为仅支持属性,方法是使用AttributeUsageAttribute标记属性,如下所示:

[AttributeUsage(AttributeTargets.Property, Inherited = false, AllowMultiple = false)]
public sealed class DependencyAttribute : Attribute { }

这可确保C#编译器在将属性放在字段上时显示编译错误。

长话短说,它与懒惰的依赖无关。