2017-07-12 1 views
2

Je me demande si je peux empêcher la création manuelle d'une classe? Je veux m'assurer que c'est seulement importé.MEF empêche l'introduction manuelle de la classe

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

Alors, je veux vous assurer que cela fonctionne:

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

Et assurez-vous cela ne:

var MHS = new TwoWayMessageHubService(logger); 
+0

Pas vraiment une solution, mais si vous avez marqué le constructeur comme '[Obsolete]' et fait FxCop/StyleCop (rappelez-vous pas qui) erreur de compilation de lancer sur l'utilisation de 'champs Obsolete'/méthodes ? –

+0

Pourquoi intentionnellement paralyser votre code? – Amy

Répondre

1

En fait cela est possible. Vous n'avez qu'à appliquer l'attribut [Import] aux paramètres de votre constructeur et rendre votre constructeur privé. J'ai fait l'exemple suivant basé sur votre code, cela fonctionne et vous pouvez le tester.

D'abord, le TwoMessageHubService avec les changements que j'ai mentionnés:

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

Notez que le constructeur est privé

Ensuite, une classe qui doit être composé avec une instance de TwoWayMessageHubService:

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

Décorer le Logger d avec Export

public interface ILogger { } 

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

et Main:

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(); 

Si vous supprimez le commentaire (lol), vous remarquerez qu'il ne compile pas.

Hope this helps

+0

Super! Juste besoin de s'assurer que le constructeur par défaut n'est pas utilisé, 'private TwoWayMessageHubService() {}' et tout est comme il se doit – katit