我想知道是否可以以某种方式阻止手动创建类?我想确保它只是导入的。

[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) { }
    }


注意构造函数是私有的

然后是一个必须由TwoWayMessageHubService实例组成的类:

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


记录仪上装有出口

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


如果您取消注释注释(大声笑),那么您会注意到它不会编译。

希望这可以帮助

关于c# - MEF防止手动实例化类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45065582/

10-11 01:46