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
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 ? –
Pourquoi intentionnellement paralyser votre code? – Amy