У меня есть эта демонстрация, которую я использую для демонстрации различных жизненных циклов DI в ASP.NET Core.Выглядит это так:
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 }
};
}
Использование встроенной в DI среды ASP.NET Core проводной связизависимости растут следующим образом:
services.AddTransient<IOperationTransient, Operation>();
services.AddScoped<IOperationScoped, Operation>();
services.AddSingleton<IOperationSingleton, Operation>();
services.AddSingleton<IOperationInstance>(new Operation(Guid.Empty));
Это отображает JSON, который показывает разные GUID для каждой из двух переходных реализаций при каждом обновлении, то же самое значение для каждой из двух реализаций реализации, которая изменяется при обновлении,то же значение для синглтона, который не меняется при обновлении, и всегда пустой Guid для регистрации экземпляра.
Я хотел показать ту же демонстрацию, используя реализацию ASP.NET Core StructureMap, описанную здесь .
Изначально я зарегистрировал свои зависимости в StructureMap следующим образом:
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: ошибка при создании типа System.Guid
Я попытался переключиться с использования Guid?
на string
для моего OperationId
собственности и снова запустил.На этот раз я получаю следующее исключение:
StructureMapBuildPlanException: невозможно создать план сборки для конкретного типа BuiltinDIDemo.Operation
new Operation (String value) ┗ String value = Обязательная зависимость примитиваявно не определено
1.) Попытка создать BuildPlan для экземпляра BuiltinDIDemo.IOperationTransient - BuiltinDIDemo.Operation 2.) Container.GetInstance (BuiltinDIDemo.IOperationTransient) 3.) Container.TryGetInstance (BuiltinDransient.InmotionDransient))
StructureMap.Pipeline.ConstructorInstance.ToBuilder(Type pluginType, Policies policies)
Итак, как мне получить StructureMap для обработки Nullable<Guid>
и примитивов с использованием значений по умолчанию?