我有一个问题要问国际奥委会专家。我正在与一位同事一起围绕温莎城堡 IoC 进行思考。我们对 asp.Net webforms 中的静态域服务对象有不同的看法。我们的基础设施层中有一个名为 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);
}
}
对我来说,这看起来我们将为每个会话提供相同的实例。那确实很糟糕!我的同事认为,由于我们所有的域服务都标记为瞬态,因此每个页面请求都会获得一个新实例。
我还阅读了一些关于由于标记为瞬态的对象未释放用于垃圾收集而导致的内存泄漏。最新版本的温莎城堡是否已解决此问题,还是我应该明确释放对象?当然,就目前而言,所有对象都是静态的,这无关紧要。