C# 延迟加载可选依赖属性会引发解析异常

C# 延迟加载可选依赖属性会引发解析异常,c#,lazy-loading,unity-container,C#,Lazy Loading,Unity Container,我使用Unity来确保我的应用程序是松散耦合的 我需要在我的一个类上使用可选属性的延迟加载。我已使用[OptionalDependency]属性标记此属性 当财产确实在Unity注册时,我的代码工作正常,我可以从财产中获得价值。如果属性尚未注册(据我所知,使用OptionalDependency会导致Unity抑制其自身的异常),我希望该属性包含null。。。但事实并非如此。我得到一个典型的Unity异常,它无法解析接口类型 我是否认为,OptionalDependency不适用于Lazy,或者

我使用Unity来确保我的应用程序是松散耦合的

我需要在我的一个类上使用可选属性的延迟加载。我已使用
[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();