2010-08-28 2 views
0

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

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); 
    } 

} 

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

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

ответ

0

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

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

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

О выпуске компонентов см. this article.

ОТМЕТЬТЕ: AddComponent -сталевая регистрация устарела, используйте вместо этого Register().