代码之家  ›  专栏  ›  技术社区  ›  Tom Troughton

中的结构图ASP.NET核心未按预期处理原语

  •  0
  • Tom Troughton  · 技术社区  · 6 年前

    我有一个演示,用于演示中的各种DI生命周期ASP.NET核心。看起来像这样:

    public interface IOperation
    {
        Guid OperationId { get; }
    }
    
    public interface IOperationTransient : IOperation { }
    public interface IOperationScoped : IOperation { }
    public interface IOperationSingleton : IOperation { }
    public interface IOperationInstance : IOperation { }
    
    public class Operation : IOperationTransient, IOperationScoped,
        IOperationSingleton, IOperationInstance
    {
        private Guid _guid;
    
        public Operation(Guid? value = null)
        {
            _guid = value == null ? Guid.NewGuid() : value.Value;
        }
    
        public Guid OperationId => _guid;
    }
    

    演示使用Web API控制器来显示DI生命周期之间的差异:

    [Route("api/[controller]")]
    public class ValuesController : Controller
    {
        private readonly IOperationTransient _transientOperation;
        private readonly IOperationTransient _transientOperation2;
        private readonly IOperationScoped _scopedOperation;
        private readonly IOperationScoped _scopedOperation2;
        private readonly IOperationSingleton _singletonOperation;
        private readonly IOperationInstance _instanceOperation;
    
        public ValuesController(
            IOperationTransient transientOperation, IOperationTransient transientOperation2,
            IOperationScoped scopedOperation, IOperationScoped scopedOperation2,
            IOperationSingleton singletonOperation, IOperationInstance instanceOperation)
        {
            _transientOperation = transientOperation;
            _transientOperation2 = transientOperation2;
            _scopedOperation = scopedOperation;
            _scopedOperation2 = scopedOperation2;
            _singletonOperation = singletonOperation;
            _instanceOperation = instanceOperation;
        }
    
        [HttpGet]
        public Dictionary<string, IOperation> Get() =>
            new Dictionary<string, IOperation> {
                { "Transient", _transientOperation },
                { "Transient2", _transientOperation2 },
                { "Scoped", _scopedOperation },
                { "Scoped2", _scopedOperation2 },
                { "Singleton", _singletonOperation },
                { "Instance", _instanceOperation }
            };
    }
    

    services.AddTransient<IOperationTransient, Operation>();
    services.AddScoped<IOperationScoped, Operation>();
    services.AddSingleton<IOperationSingleton, Operation>();
    services.AddSingleton<IOperationInstance>(new Operation(Guid.Empty));
    

    这将显示JSON,它在每次刷新时为两个临时实现显示不同的GUID,为刷新时更改的两个作用域实现中的每一个显示相同的值,为刷新时不更改的singleton显示相同的值,并且实例注册始终是空的GUID。

    我想用 StructureMap's ASP.NET Core implementation described here .

    registry.For<IOperationTransient>().Use<Operation>().AlwaysUnique();
    registry.For<IOperationScoped>().Use<Operation>().ContainerScoped();
    registry.For<IOperationSingleton>().Use<Operation>().Singleton();
    registry.For<IOperationInstance>().Use(new Operation(Guid.Empty));
    

    但现在当我运行应用程序时,我看到以下服务器异常:

    ArgumentException:GUID的字节数组的长度必须正好为16个字节。 参数名称:b

    System.Guid..ctor(Byte[] b)
    lambda_method(Closure , IBuildSession , IContext )
    

    StructureMapBuildException:生成类型时出错系统.Guid

    我试着从使用 Guid? 到a string 为了我的 OperationId 属性并再次运行它。这次我得到了以下例外:

    StructureMapBuildPlanException:无法为创建生成计划 混凝土类型内置演示。操作

    new Operation(String value)String value=必需的原语 未显式定义依赖关系

    2.)容器.GetInstance(BuiltinDIDemo.IOperationTransient) 3.)容器.TryGetInstance(BuiltinDIDemo.IOperationTransient)

    StructureMap.Pipeline.ConstructorInstance.ToBuilder(Type pluginType, Policies policies)
    

    Nullable<Guid> 的和原语使用默认值?

    0 回复  |  直到 6 年前