我有一个演示,用于演示中的各种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>
的和原语使用默认值?