Ошибка экземпляра и взаимодействие с единичным поведением [NInject1] - PullRequest
1 голос
/ 03 апреля 2010

Я установил привязку NInject (используя версию 1.5) следующим образом:

Bind<ISessionFactory>().ToMethod<ISessionFactory>(ctx => 
{
    try
    {
        // create session factory, might fail because of database issues like wrong connection string
    }
    catch (Exception e)
    {
        throw new DatabaseException(e);
    }
}).Using<SingletonBehavior>();

Как видите, эта привязка использует одноэлементное поведение, но также может выдавать исключение, если что-то настроено неправильно, например, неправильная строка подключения к базе данных.

Теперь, когда сначала не удается создать фабрику сеанса (выдает исключение из базы данных), NInject не пытается создать объект заново, но всегда возвращает ноль.

Мне понадобится NInject, чтобы сначала проверить наличие нуля и воссоздать, когда экземпляр равен нулю, но, конечно, не тогда, когда уже успешно создан экземпляр (сохраняя его одиночным). Как это:

var a = Kernel.Get<ISessionFactory>(); // might fail, a = null
// ... change some database settings
var b = Kernel.Get<ISessionFactory>(); // might not fail anymore, b = ISessionFactory object

Нужно ли мне написать собственное поведение или я что-то упустил?

1 Ответ

1 голос
/ 06 апреля 2010

Это не имеет особого смысла.

Во-первых, смысл синглтона в том, что все, что зависит от этого предмета, должно видеть одно и то же - этого очень трудно достичь, если ваш фабричный метод передумает.

Кроме того, если вы говорите о NHibernate ISessionFactory (не так ли?), У него не будет временных сбоев такого рода, которые можно восстановить (или, если это возможно, вы можете объяснить, почему - я нет эксперта по этому вопросу). Я ценю, что создание сеанса может потерпеть неудачу (но вы не будете хранить его как одноэлементное), но это полностью отличается от создания неудачного завода (если вы не можете полагаться на свои фабрики, чтобы иметь тупые конструкторы, что вы можете положиться?).

С точки зрения угла NInject, метод создания (будь то Фабрика или Поставщик) отделен от области видимости, поэтому я сомневаюсь, что будет способ управлять тем, что вы хотите сделать чисто (даже если Вы можете решить первые два вопроса). Я настоятельно рекомендую посмотреть на источник - он короткий и чистый, поэтому, если ответ есть, он сразу же появится. Загрузка займет у вас не более минуты - иди делай!

Наконец, хорошая статья по управлению сессиями NHibernate (В которой IIRC не предусмотрены какие-либо условия для сбоя при создании фабрики сеансов)

Теперь, чтобы на самом деле ответить на вопрос, независимо от того, является ли он плохим, - если это было возможно для неудачи при создании фабрики, и вы не могли настроить фабрику, чтобы не делать этого (сколько повторных попыток выглядит, как вы видели, для создания фабрик?), ответ заключается в том, что вы бы переместили логику повторных попыток (для создания Фабрики) в Провайдера или Метод, который отвечает за создание Сессий, которые затем могут повторить попытку, как вы считаете нужным.

...