0

MEF 2 (Microsoft.Composition) を検討しており、既存のコード ベースと統合することを検討しています。

私の現在のコードベースにはIFactory、単純な署名を持つインターフェイスがあります。

public interface IFactory<T>
{
    T Create();
}

Func<T>工場を登録して、工場でエクスポートを行うと、工場のT出力として登録されるようにしたいと考えています。だから、このようなもの:

[Export]
public class Factory : IFactory<Class>
{
    public Class Create() => new Class();
}            

次のコードを使用して、新しいClassインスタンスとCreateメソッドへの参照を (デリゲートとして) 返します。Func<Class>

using ( var container = new ContainerConfiguration()
    // ... magic missing here.
    .CreateContainer() )
{
    var instance = container.GetExport<Class>(); // instance is created from the Factory.Create above.
    var factory = container.GetExport<Func<Class>>(); // this is a reference to the Factory.Create delegate defined above.
}

私はこの質問を見ましたが、MEF 2には当てはまらないようです。現在、あらゆる種類のものは異なりますが、はるかに軽量/合理化されているようです(宣伝されているように!)。

MEF 2 でやりたいことを達成することは可能ですか?

4

1 に答える 1

2

public Class Create() => new Class();デリゲートではありません。C# 6 では、これはExpression-bodied member functionとして知られています。

次の 2 つのステートメントは、C# 6 では同等です。

// Expression-bodied member function
public MyClass Create() => new MyClass();

// standard member function
public MyClass Create()
{
    return new MyClass();
}

ファクトリを解決IFactory<Class>してから使用する限り、必要に応じてエクスポートして使用するタイプでファクトリを装飾するだけです。

[Export( typeof( IFactory<MyClass> ) )]
public class Factory : IFactory<MyClass>
{
    public MyClass Create() => new MyClass();
}

コンテナが構築された後、解決策は次のとおりです。

var factory = container.GetExport<IFactory<MyClass>>();

MyClass mc = factory.Create();
于 2016-02-29T00:10:40.400 に答える