Почему GetCurrentRegistrations не возвращает мою открытую регистрацию c - PullRequest
1 голос
/ 12 февраля 2020

У меня возникают проблемы с пониманием того, что именно возвращается из вызова на GetCurrentRegistrations.

. Я пытаюсь выполнить sh, чтобы определить, был ли уже вызван вызов Register. перед. В этом случае я хотел бы пропустить и продолжить. Важно, чтобы контейнер не блокировался в процессе!

Например:

var container = new Container();
container.Register(typeof(IFoo), typeof(Foo), Lifestyle.Transient);
var currentRegistrations = container.GetCurrentRegistrations();
if (currentRegistrations.Any(r => producer.ServiceType == typeof(ICommandHandler<>))
{
    // skip
}

Выше, кажется, работает отлично. Однако, когда открыты типы, например c, вызов GetCurrentRegistrations не возвращает регистрацию:

var container = new Container();
container.Register(typeof(ICommandHandler<>), typeof(CommandHandler<>), Lifestyle.Transient);
var currentRegistrations = container.GetCurrentRegistrations();
if (currentRegistrations.Any(r => producer.ServiceType == typeof(ICommandHandler<>))
{
    // currentRegistrations is empty, so we are not getting here :-(
}

Есть ли другой способ определить это (без блокировки контейнера)?

Если посмотреть на тип возвращаемого значения, не будет ли лучше имя GetCurrentInstanceProducers? Если подумать ... (возможно, частично отвечая на мой собственный вопрос сейчас), может быть, фактические InstanceProducers еще не доступны для открытых обобщенных c регистраций?

1 Ответ

1 голос
/ 13 февраля 2020

GetCurrentRegistrations не может вернуть регистрации open-generi c, поскольку InstanceProducer существует только для одного типа closed-generi c. Таким образом, одна открытая регистрация c может привести к сотням InstanceProducer экземпляров. Открытое обобщение в Simple Injector выполняется с помощью незарегистрированного разрешения типов, что означает, что конструкция похожа на наличие события. В случае разрешения закрытого универсального c типа, для которого не существует явной регистрации, Simple Injector проверяет, существует ли соответствующая открытая универсальная c регистрация. Только в последний момент создается InstanceProducer.

Таким образом, вы не можете использовать GetCurrentRegistrations для выполнения работы. В вашем случае вам, вероятно, лучше установить флаг в контейнере, чтобы пропустить регистрацию. Например:

private static readonly object key = new object();

public static void MyExtensionMethod(this Container container)
{

    if (container.ContainerScope.GetItem(key) is null)
    {
        // do registrations here
        container.ContainerScope.SetItem(key, new object());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...