Виндзорский замок IoC поток безопасности статические переменные - PullRequest
0 голосов
/ 29 августа 2010

У меня есть вопрос к Ioc-гуру.Я работаю с коллегой, чтобы сосредоточиться на замке Виндзор IoC.У нас есть разногласия по поводу статических объектов доменной службы в веб-формах asp.Net.У нас есть статическая фабрика BLServiceFactory на нашем уровне инфраструктуры, которая извлекает контейнер.

public sealed class BLServiceFactory
{
    private static BLServiceFactory _instance = new BLServiceFactory();


    IWindsorContainer _container = new WindsorContainer();
    public static BLServiceFactory Instance
    {

        get
        {return _instance;}
    }

    public T Create<T>()
    {
        return (T)_container[typeof(T)];
    }

    private BLServiceFactory()
    {

        _container.AddComponent("DataContext", typeof(DAL.DataContextFactory), typeof(DAL.CPContextFactory));
        _container.AddComponent("Repository", typeof(DAL.IRepository<>), typeof(DAL.Repository<>));
        _container.AddComponent("UserManager", typeof(BL.IUserManager), typeof(BL.UserManager));
        _container.AddComponent("RoleService", typeof(BL.IRoleService), typeof(BL.RoleService));
    }

}

Мы извлекаем экземпляры с фабрики из нашего кода, как это.

public partial class PrintList : System.Web.UI.Page
{
    private static readonly ISchoolManager _schoolService = BLServiceFactory.Instance.Create<ISchoolManager>(); 

    Models.TechSchool _tech;

    protected void Page_Load(object sender, EventArgs e)
    {

        _tech = _schoolService.GetSchoolForTechPrep(Profile.UserName);

    }

    protected void DoOtherStuff...
    {
      _schoolService.Foo(_tech);
    }

}

Мне кажется, что мы будем обслуживать один и тот же экземпляр для каждого сеанса.Это было бы действительно плохо!Мой коллега считает, что, поскольку все наши доменные службы помечены как временные, каждый запрос к странице получает новый экземпляр.

Я также читал немного об утечках памяти из-за объектов, помеченных как временные, которые не были освобождены для сбора мусора.,Было ли это исправлено в последней версии Castle Windsor, или я должен явно выпускать объекты?Конечно, в нынешнем виде все объекты статичны, и это не имеет значения.

1 Ответ

0 голосов
/ 29 августа 2010

BLServiceFactory является сервисным локатором .Я рекомендую использовать CommonServiceLocator вместо вашего собственного, если вы собираетесь использовать сервисный локатор.Регистрация компонента не принадлежит внутри локатора службы.

Теперь в опубликованном вами коде нет упоминания о переходных компонентах, если только вы не пометили их атрибутом [Transient].Если вы этого не сделаете, эти компоненты будут синглетонами, что является стандартным образом жизни в Виндзоре.

Поскольку переменная _schoolService в PrintList является статической, тот же экземпляр ISchoolManager будет использоваться длявсе запросы на страницу PrintList.Если вы действительно хотите, чтобы оно было временным, удалите ключевое слово «static».

Сведения об освобождении компонентов см. в этой статье .

BTW: AddComponent регистрация стиляустарела, вместо этого используйте Register().

...