我正在使用一些旧的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;
作为参考,我使用文档中的代码来填充标记有属性的代码隐藏中的属性,并且所有工作都很好地阻止了上面的延迟注册。
有人能够帮助或发现我做过的蠢事吗?
答案 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#编译器在将属性放在字段上时显示编译错误。
长话短说,它与懒惰的依赖无关。