温莎城堡IoC线程安全静态变量

时间:2010-08-28 23:33:43

标签: webforms thread-safety castle-windsor transient

我对那里的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的最新版本中解决过的,还是我应该明确地释放对象?当然,现在看来,所有对象都是静态的,这是无关紧要的。

1 个答案:

答案 0 :(得分:0)

BLServiceFactory服务定位器。如果您打算使用服务定位器,我建议使用CommonServiceLocator而不是您自己的this article。组件注册属于服务定位器。

现在,在您发布的代码中,没有提到这些组件是瞬态的,除非您使用[Transient]属性标记它们。如果你没有,那些组件将是单身,这是温莎的默认生活方式。

由于_schoolService中的变量PrintList是静态的,ISchoolManager的同一个实例将用于PrintList页面的所有请求。如果您确实希望它是瞬态的,请删除“static”关键字。

关于发布组件,请参阅{{3}}。

BTW:AddComponent - 不推荐使用样式注册,而是使用Register()