2017-07-12 13 views
2

私は何とかクラスを手作業で作成しないようにすることができますか?私はそれがインポートされていることを確認したい。だから、MEFがクラスを手作業で作成するのを防ぐ

[Export] 
[PartCreationPolicy(CreationPolicy.Shared)] 
public class TwoWayMessageHubService 
{ 
    [ImportingConstructor] 
    public TwoWayMessageHubService(ILoggerService loggerService) 
    { 
    } 
} 

、私はこの作品を確認する:

[Import] 
public TwoWayMessageHubService MHS {get; set;) 

そして、これがないことを確認してください:実際には

var MHS = new TwoWayMessageHubService(logger); 
+0

そうでもない解決に役立ちますが、FxCopの/ StyleCop(これは覚えていない) 'Obsolete'フィールド/メソッドの使用方法のスローコンパイルエラー? –

+0

なぜあなたのコードに意図的に障害があるのですか? – Amy

答えて

1

これが可能です。 [インポート]属性をコンストラクタのパラメータに適用して、コンストラクタをプライベートにする必要があります。私はあなたのコードに基づいて次のサンプルを作った、それは動作し、あなたはそれをテストすることができます。

まず、私が述べた変更でTwoMessageHubService

:コンストラクタはTwoWayMessageHubServiceのインスタンスで構成されなければならないクラス次に プライベート

であることを

[Export] 
    [PartCreationPolicy(CreationPolicy.Shared)] 
    public class TwoWayMessageHubService 
    { 
     [ImportingConstructor] 
     private TwoWayMessageHubService([Import]ILogger logger) { } 
    } 

お知らせ

public class Implementer 
    { 
     [Import] 
     public TwoWayMessageHubService MHS { get; set; } 
    } 

ロガーデコレートD とエクスポート

public interface ILogger { } 

    [Export(typeof(ILogger))] 
    public class Logger : ILogger { } 

をメイン:あなたがコメント(笑)そして、あなたはそれがコンパイルされないことがわかりますコメントを解除した場合

var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly()); 
      var container = new CompositionContainer(catalog); 

      var implementer = new Implementer(); 
      container.ComposeParts(implementer); 
      //var IdoNotCompile = new TwoWayMessageHubService(new Logger()); 

      Console.ReadLine(); 

希望はこれを使用すると、 `[廃止]`として、コンストラクタをマークして作られた場合は何を

+0

素晴らしい!デフォルトのコンストラクタが使用されていないことを確認する必要があります。 'Private TwoWayMessageHubService(){}' – katit

関連する問題