2016-10-30 4 views
1

私はASP.NET MVC 5と共にManaged Extensibility Framework (MEF)を使用するアプリケーションを持っています。このアーキテクチャでは、複数のアプリケーションを構築して1つのマスターアプリケーションにすべて実行できるプラグイン可能な設計が可能です。また、認証と許可の検証/ロードのために1つの中心的な場所を持つことができました。C#でMEFを使用する場合、どのようにエクスポート属性のラッパーを作成できますか?

MVC 5をMEFで使用するには、各コントローラに一意のエクスポート値が必要です。したがって、私は各プラグインへの輸出額を一意にするために私のコントローラ

[Export("SomeUniqueValue1", typeof(IController))] 
[PartCreationPolicy(CreationPolicy.NonShared)] 

のそれぞれにこれらの2つのラインのコードを追加する必要があり、私は輸出額にプラグイン名を連結したいです。代わりに、上記の2行を使用するので、私は今、この代わりに

[Export("PluginName.SomeUniqueValue1", typeof(IController))] 
[PartCreationPolicy(CreationPolicy.NonShared)] 

のようなものを使用します、私は、単一のように、上記のコードの2行を排除することによって、いくつかの符号化時間を節約するために期待しています。私はその後、MefExportクラスは、与えられた名前にプラグイン名の連結を処理すると、何とかExportクラスを呼び出し、PartCreationPolicy

どのように作成することができます

[MefExport("SomeUniqueValue1")] 

以下の行のようなものを期待していますプラグイン名を追加してExportPartCreationPolicyと呼ぶことができるExportクラスを拡張する "MefExport"クラス?

これは、私は私はあなたが合理的に一つに両方の属性を組み合わせることができるとは思わない

public class MefExport : ExportAttribute 
{ 
    public MefExport(string exportName) 
    { 
     string finalExportValue = Helpers.GetPluginName() + exportName; 

     new ExportAttribute(finalExportValue, typeof(IController)); 
    } 
} 
+1

Will Rayによって与えられた答えはあなたの問題の良い解決策ですが、あなたのエクスポート属性をよりわかりやすく説明することをお勧めします。 Imo、 '[MEFExport]'は '[MEFControllerExport]'や '[ControllerExport]'のような名前にすることができます。そうすれば、あとであいまいになることなくプラグインの定義を追加する余地が生まれます。 – Silvermind

答えて

2

で開始するものです。 PartCreationPolicyAttributeは密封されたクラスであり、その属性を探しているコードではそのタイプが正確に必要です。 - あなたはこのカスタムのために異なるニーズを持っているかもしれ

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = true, Inherited = false)] 
public sealed class MefExportAttribute : ExportAttribute 
{ 
    public MefExportAttribute(string exportName) 
     : base(GetContractName(exportName), typeof(IController)) 
    { 
    } 

    private static string GetContractName(string exportName) 
    { 
     return Helpers.GetPluginName() + exportName; 
    } 
} 

(私はちょうどExportAttributeAttributeUsage値がコピーされた:

しかし、あなたはあなたの計算値と基本クラスを呼び出すことにより、最初のビットを簡素化することができ属性)。

+0

ありがとうございます。このラインは何をしていますか? ' – Jaylen

+0

@Jaylen属性がコードでどのように使用されるかを定義します。このインスタンスの場合、「MefAttributeは、クラス、メソッド、プロパティ、フィールドで使用できます。これらのオブジェクトのいずれかで複数回使用できます。これらのオブジェクトをオーバーライドまたは継承するクラスは、この属性を継承しません" –

+0

この属性を使用するとエラーが表示されます。制約に一致するエクスポートが見つかりませんでした。ContractName SomeUniqueValue RequiredTypeIdentity System.Web.Mvc.IController' – Jaylen

関連する問題