MEF 阻止 class 被手动实例化
MEF prevent class from being manually instatiated
我想知道我是否可以以某种方式阻止 class 被手动创建?我想确保它只是进口的。
[Export]
[PartCreationPolicy(CreationPolicy.Shared)]
public class TwoWayMessageHubService
{
[ImportingConstructor]
public TwoWayMessageHubService(ILoggerService loggerService)
{
}
}
所以,我想确保它有效:
[Import]
public TwoWayMessageHubService MHS {get; set;)
并确保这不会:
var MHS = new TwoWayMessageHubService(logger);
其实这是可以的。只需将 [Import] 属性应用于构造函数的参数,并将构造函数设为私有即可。我根据您的代码制作了以下示例,它可以工作,您可以测试它。
首先,TwoMessageHubService 进行了我提到的更改:
[Export]
[PartCreationPolicy(CreationPolicy.Shared)]
public class TwoWayMessageHubService
{
[ImportingConstructor]
private TwoWayMessageHubService([Import]ILogger logger) { }
}
注意构造函数是private
然后 class 必须与 TwoWayMessageHubService 实例组成:
public class Implementer
{
[Import]
public TwoWayMessageHubService MHS { get; set; }
}
用 Export
修饰的 Logger
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();
如果你取消注释(笑)然后你会注意到它不会编译。
希望对您有所帮助
我想知道我是否可以以某种方式阻止 class 被手动创建?我想确保它只是进口的。
[Export]
[PartCreationPolicy(CreationPolicy.Shared)]
public class TwoWayMessageHubService
{
[ImportingConstructor]
public TwoWayMessageHubService(ILoggerService loggerService)
{
}
}
所以,我想确保它有效:
[Import]
public TwoWayMessageHubService MHS {get; set;)
并确保这不会:
var MHS = new TwoWayMessageHubService(logger);
其实这是可以的。只需将 [Import] 属性应用于构造函数的参数,并将构造函数设为私有即可。我根据您的代码制作了以下示例,它可以工作,您可以测试它。
首先,TwoMessageHubService 进行了我提到的更改:
[Export]
[PartCreationPolicy(CreationPolicy.Shared)]
public class TwoWayMessageHubService
{
[ImportingConstructor]
private TwoWayMessageHubService([Import]ILogger logger) { }
}
注意构造函数是private
然后 class 必须与 TwoWayMessageHubService 实例组成:
public class Implementer
{
[Import]
public TwoWayMessageHubService MHS { get; set; }
}
用 Export
修饰的 Logger 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();
如果你取消注释(笑)然后你会注意到它不会编译。
希望对您有所帮助