#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 /… для получения более подробной информации.