初始化惰性实例时,将参数传递给构造函数

时间:2010-12-09 09:40:05

标签: c# constructor mef lazy-initialization

我知道如果变量声明为Lazy,那么当我们使用Value属性时会调用它的构造函数。

我需要将一些参数传递给此Lazy实例,但无法找到正确的语法。 这不是我的设计,我正在使用MEF和ExportFactory,它会返回我Lazy个部件的实例。我的部分有构造函数,我需要用一些参数调用这些构造函数。

2 个答案:

答案 0 :(得分:8)

您可以导出自己的Func

public class FooFactory
{
    [Export(typeof(Func<string,int,ExportLifetimeContext<IFoo>>))]
    public ExportLifetimeContext<IFoo> CreateFoo(string param1, int param2)
    {
        Foo foo = new Foo(param1, param2);
        return new ExportLifetimeContext<IFoo>(foo,
            delegate
            {
                // Clean-up action code goes here. The client might not be able 
                // to do this through the IFoo interface because it might not
                // even expose a Dispose method.
                //
                // If you created other hidden dependencies in order to construct
                // Foo, you could also clean them up here. 
                foo.Dispose();
            });
    }
}

并将其导入其他地方:

[Export(typeof(ISomething))]
public class FooUser : ISomething
{
    private readonly Func<string,int,ExportLifetimeContext<IFoo>> fooFactory;

    [ImportingConstructor]
    public FooUser(Func<string,int,ExportLifetimeContext<IFoo>> fooFactory)
    {
        this.fooFactory = fooFactory;
    }

    public void DoSomething()
    {
        using (var fooLifetime = this.fooFactory("hello", 3))
        {
            IFoo foo = fooLifetime.Value;
            ...
        }
    }
}

如果您不需要清理操作,那么您可以通过丢弃所有ExportLifetimeContext内容来大大简化此操作。

但是,IFoo的某些实现可能是一次性的(或依赖于其他一次性对象),而其他实现则不是。所以最正确的做法是在抽象中构建一个“我完成了这个对象”的信号,这是ExportLifetimeContext提供的。

答案 1 :(得分:2)

当您使用ExportFactory创建构造函数参数时,MEF没有内置的方法将构造函数参数传递给零件。像Wim Coenen所暗示的那样可能是达到你想要的最佳方式。