1

私はMEFを使い始めました。私のアプリケーションでは、いくつかのモデルのファクトリがあります。私の工場には2つの作成方法があります。1 つはパラメーターとして名前を取り、もう 1 つは型を取ります。

[Export(typeof(IFactory))]
[PartCreationPolicy(CreationPolicy.Shared)]
public class MyFactory : IFactory
{
    public IModel Create(String name) {...}
    public IModel Create(Type type) {...}
}

public class Foo
{
    [Import(typeof(IFactory))]
    public IFactory Factory { get; set; }

    public Foo()
    {
        IModel modelByName = Factory.Create("name");
        IModel modelByType = Factory.Create(typeof(Foo));
    }
}

現時点では、ファクトリをインポートしてから、ファクトリ オブジェクトで create を呼び出してモデルを取得する必要があります。今、次のようなモデルを直接インポートする方法があるかどうか疑問に思っています:

[Import(typeof(IModel), Name:"Name")]
public IModel Model { get; set; }

編集 - - - - - - - - - - - - - - - - - - - - - - - - - --

目標は、次のようなものを置き換えることです。

public class Foo
{
    [Import(typeof(IFactory))]
    public IFactory Factory { get; set; }

    public IModel Model { get; set; }
    public IModel Model1 { get; set; }

    public Foo()
    {
        Model = Factory.Create("Foo");
        Model1 = Factory.Create(typeof(Foo1));
    }
}

このような何か:

public class Foo
{
    //Should internal import a IFactory(singeleton) object 
    //and call the Create(name:String) method on it
    [Import(typeof(IModel), Name:"Foo")]
    public IModel Model { get; set; }

    //Should internal import a IFactory(singeleton) object 
    //and call the Create(type:Type) method on it
    [Import(typeof(IModel), Type: typeof(Foo1))]
    public IModel Model1 { get; set; }
}
4

2 に答える 2

1

[Import]属性のパラメーターを、インポートされる型のメソッドに渡すことはできません。

ただし、可能であればそうするべきではないと思います。そのようなインポートを行うと、クラスが構築され、時期尚早に構築される可能性が高いからです。実際に必要になるまで、オブジェクトの構築を遅らせる必要があります。直接インポートを行うと、この怠惰な動作がなくなります。

また、ファクトリは通常、型を構築するためにいくつかのパラメーターを必要としますが、ここではそうではありません。絶対に直接インポートする必要がある場合は、ファクトリの代わりに型自体をインポートできます (もちろん、後でファクトリの動作を変更することで簡単に構造を操作するオプションが失われます)。

于 2013-02-03T19:57:32.690 に答える
0

エクスポートにコントラクト名を追加して、パーツをインポートするときにそれらを使用できます。

IModelインターフェースの場合:

public interface IModel { }

IModelコントラクト名を使用して実装をエクスポートできます。

[Export("Foo1", typeof(IModel))]
public class Foo1 : IModel { }

1つのクラスに複数のエクスポート属性を追加することもできます。このようにして、両方の種類のインポート(名前とタイプ)を満たすことができます。

[Export("Foo2", typeof(IModel))]
[Export(typeof(Foo2))]
public class Foo2 : IModel { }

次に、次のようにインポートします。

public class Foo
{
    //Import using the contract name.
    [Import("Foo1", typeof(IModel))]
    public IModel Model1 { get; set; }

    //Import using the actual type.
    [Import(typeof(Foo2))]
    public IModel Model2 { get; set; }

    //Import the same model but with contract name instead of type. 
    //This is possible because there are two different exports.
    [Import("Foo2")]
    public IModel Model3 { get; set; }
}    

ご覧のとおり、antfactoryを使用する必要はまったくありません。MEFがあなたの工場になります。

于 2013-02-03T22:31:35.953 に答える