Несколько вопросов о Castle Windsor

#c# #castle-windsor #castle

#c# #castle-Виндзор #castle

Вопрос:

Несколько вопросов о Castle Windsor.

У меня есть сервис, который выглядит следующим образом:

 public interface IMysRepository
{
    ISomeObject GetById(int id);
}

public interface IMyService
{
     ISomeObject GetById(int id);
}

public class MyService : IMyService
{
     MyService(IMysRepository repository)
     {
          _repository = repository;
     }


     public ISomeObject GetById(int id)
     {
          return _repository.GetById(id);
     } 

     IMysRepository _repository
}
  

Я думаю, что лучшее, что можно сделать, это сохранить это в контейнере, но не уверен, следует ли мне сохранять это как одноэлементное или переходное. Единственное состояние, которое он сохраняет, — это репозиторий. Я подумал, что лучшим способом было бы использовать Singleton, и код тоже выглядит чище. Например:

 //Singleton version.
var service = container.Reslove<IMyService>();
var obj = IMyService.GetById(100);
  

против

 //Transient version.
var service = container.Reslove<IMyService>();
try
{
     var obj = IMyService.GetById(100);
}
finally
{
   container.Release(service);
}
  

Также мне интересно другое, является ли Castle потокобезопасным?

Ответ №1:

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

Кстати: вы должны стараться избегать вызова Resolve() насколько это возможно. Не вызывайте контейнер, он вызовет вас.

И да, Windsor потокобезопасен.

Комментарии:

1. Спасибо за ответ. Я не совсем понимаю, что вы подразумеваете под «не использовать разрешение», потому что я в значительной степени делаю все, что написано в блоге. Кроме того, на данный момент я просто использую ADO.NET для получения данных из базы данных. Я думаю, мне следует использовать Transient. Если вы не позвоните. При выпуске во время переходного процесса у вас произошла утечка ресурсов, верно?

2. @Michael: в идеале вы должны вызывать Resolve и Release только на корневых сайтах. О выпуске, в двух словах, вы должны выпустить то, что вы явно разрешаете. Смотрите kozmic.pl/2010/08/27 /… для получения более подробной информации.