C# 延迟加载可选依赖属性会引发解析异常
我使用Unity来确保我的应用程序是松散耦合的 我需要在我的一个类上使用可选属性的延迟加载。我已使用C# 延迟加载可选依赖属性会引发解析异常,c#,lazy-loading,unity-container,C#,Lazy Loading,Unity Container,我使用Unity来确保我的应用程序是松散耦合的 我需要在我的一个类上使用可选属性的延迟加载。我已使用[OptionalDependency]属性标记此属性 当财产确实在Unity注册时,我的代码工作正常,我可以从财产中获得价值。如果属性尚未注册(据我所知,使用OptionalDependency会导致Unity抑制其自身的异常),我希望该属性包含null。。。但事实并非如此。我得到一个典型的Unity异常,它无法解析接口类型 我是否认为,OptionalDependency不适用于Lazy,或者
[OptionalDependency]
属性标记此属性
当财产确实在Unity注册时,我的代码工作正常,我可以从财产中获得价值。如果属性尚未注册(据我所知,使用OptionalDependency
会导致Unity抑制其自身的异常),我希望该属性包含null
。。。但事实并非如此。我得到一个典型的Unity异常,它无法解析接口类型
我是否认为,OptionalDependency
不适用于Lazy
,或者我遗漏了什么(Unity或Lazy类)
以下是我目前正在编写的代码示例:
[OptionalDependency]
public Lazy<IEventCollection<T>> EventCollection { get; set; }
public IEnumerable<IEvent<T>> Events
{
get
{
if (EventCollection != null && EventCollection.Value != null) //Exception thrown on this line
return EventCollection.Value.Events;
else
return null;
}
}
正如我所写的——这是Unity在尝试解析尚未注册的接口映射时抛出的标准异常。再一次-我的理解是,[OptionalDependency]
应该处理这个确切的情况。看来Unity(至少版本3.5.1404.0)确实存在[OptionalDependency]
和惰性
的问题
考虑以下示例:
public interface IFoo
{
void Operation();
}
public class Foo : IFoo
{
[OptionalDependency]
public Bar Bar { get; set; }
public void Operation()
{
if (Bar == null)
Console.Write("Bar is null..");
else
Console.Write("Bar isn't null!");
}
}
(...)
container.RegisterType<IFoo, Foo>(); //container is an IUnityContainer
var fooInstance = container.Resolve<IFoo>();
fooInstance.Operation();
公共接口IFoo
{
无效操作();
}
公共类Foo:IFoo
{
[可选依赖关系]
公共条{get;set;}
公开行动()
{
如果(Bar==null)
Console.Write(“条为空…”);
其他的
编写(“条不是空的!”);
}
}
(...)
container.RegisterType()//容器是一个IUnityContainer
var fooInstance=container.Resolve();
fooInstance.Operation();
上述代码将按预期运行-在不注册Bar
的情况下调用测试操作将导致Bar为空。。写入控制台
但是,在代码(将public Bar
更改为public Lazy
并将Bar==null
更改为Bar==null | | | Bar.Value==null
)稍有变化后,调用Bar.Value
会抛出一个统一异常
唯一的解决方法是在
条上手动放置一个try-catch块。Value
实际异常是什么?@tdbeckett我已经在问题中添加了异常。我认为问题在于IEventCollection
是一个接口,您无法创建它的实例。您是否有从IEventCollection
到可实例化类的映射?我不明白你为什么要让它变懒,我假设你的EventCollection
是一个轻量级的类?@thumbmunkeys没有,但这正是我使用OptionalDependency
属性的原因!代码来自一个可以重用的基类,映射将仅在特定情况下创建。在其他情况下(仅使用我的类的基本实现),它将丢失。据我所知,[OptionalDependency]
应该处理这种情况,并且只返回null。。。至于为什么它是懒惰的——这防止了Unity内部的循环依赖解决问题;IEventCollection
可以包含需要Unity来解析可能需要或不需要当前类的属性的类。
public interface IFoo
{
void Operation();
}
public class Foo : IFoo
{
[OptionalDependency]
public Bar Bar { get; set; }
public void Operation()
{
if (Bar == null)
Console.Write("Bar is null..");
else
Console.Write("Bar isn't null!");
}
}
(...)
container.RegisterType<IFoo, Foo>(); //container is an IUnityContainer
var fooInstance = container.Resolve<IFoo>();
fooInstance.Operation();