我对那里的Ioc大师有一个问题。 我正与一位同事一起围绕Castle Windsor IoC进行思考。我们对asp.Net webforms中的静态域服务对象有不同的看法。我们在Infrastructure层中有一个名为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);
}
}
对我来说,这看起来我们将为每个会话提供相同的实例。那确实很糟糕!我的同事认为,由于我们所有的域服务都标记为Transient,因此每个页面请求都会获得一个新实例。
我还读过一些关于内存泄漏的内容,因为标记为瞬态的对象没有为垃圾回收而释放。这是在Castle Windsor的最新版本中解决过的,还是我应该明确地释放对象?当然,现在看来,所有对象都是静态的,这是无关紧要的。
答案 0 :(得分:0)
BLServiceFactory
是服务定位器。如果您打算使用服务定位器,我建议使用CommonServiceLocator而不是您自己的this article。组件注册不属于服务定位器。
现在,在您发布的代码中,没有提到这些组件是瞬态的,除非您使用[Transient]
属性标记它们。如果你没有,那些组件将是单身,这是温莎的默认生活方式。
由于_schoolService
中的变量PrintList
是静态的,ISchoolManager
的同一个实例将用于PrintList
页面的所有请求。如果您确实希望它是瞬态的,请删除“static”关键字。
关于发布组件,请参阅{{3}}。
BTW:AddComponent
- 不推荐使用样式注册,而是使用Register()
。