Castle.Windsor, ASP.NET MVC, Обработка нулевого разрешения впрыска - PullRequest
2 голосов
/ 07 февраля 2011

Используя Castle.Windsor в ASP.NET MVC (3.0), есть ли способ, которым я могу надлежащим образом обработать, если одна из моих зависимостей разрешается нулем? Например, скажем, у меня есть IMembershipService.

class ServiceInstaller
{
 // ... 
 void Install( // .. )
 { 
  container.Register(
  Component
  .For<IMembershipService>()
  .ImplementedBy<MembershipService>()
  .LifeStyle.PerWebRequest
  );
 }
}

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

Что я могу сделать в этом случае? Я могу написать if(membershipService == null) сто раз, но это выглядит довольно глупо. Есть ли встроенное решение, чтобы сказать «Эй, если у нас есть ошибка, сделайте это ..?»

Ответы [ 2 ]

4 голосов
/ 07 февраля 2011

Я думаю, что сервис никогда не должен быть нулевым. Если база данных не работает, сервис все же должен быть возвращен, но его методы должны выдавать исключение, возвращать нулевое значение или некоторое значение по умолчанию, в зависимости от семантики сервиса.

0 голосов
/ 09 апреля 2014

Сиэль, У меня была эта проблема совсем недавно , и я нашел ваш вопрос, когда искал ответ.

В основном вы должны использовать типизированную фабрику для разрешения ваших компонентов во время выполнения в вашем компоненте упаковки. Фабрика должна возвращать объект по умолчанию, если нет совпадения с компонентом, который вы ищете, объект по умолчанию, который будет реализовывать любое необходимое поведение.

В случае IMembershipService, реализуйте класс NotCheckingMembershipService, наследующий интерфейс и ничего не делающий, и установите его по умолчанию для компонентов, которым он не нужен. Более конкретные службы членства могут быть связаны с конкретными контроллерами.

Для этого вы должны создать универсальную "всеобъемлющую" реализацию

public class NotCheckingMembershipService<T>: IMembershipService<T> where T: Controller
{
}

И зарегистрировать его как компонент по умолчанию для открытия IMembershipService

_container.Register(
            Component.For(typeof(IMembershipService<>))
            .ImplementedBy(typeof(NotCheckingMembershipService<>))
            .IsDefault());

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

...