У меня есть вопрос для гуру 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, или я должен явно выделять объекты? Конечно, как сейчас, все объекты статичны, и это было бы неуместно.