0

我有一个问题要问国际奥委会专家。我正在与一位同事一起围绕温莎城堡 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);
    }

}

对我来说,这看起来我们将为每个会话提供相同的实例。那确实很糟糕!我的同事认为,由于我们所有的域服务都标记为瞬态,因此每个页面请求都会获得一个新实例。

我还阅读了一些关于由于标记为瞬态的对象未释放用于垃圾收集而导致的内存泄漏。最新版本的温莎城堡是否已解决此问题,还是我应该明确释放对象?当然,就目前而言,所有对象都是静态的,这无关紧要。

4

1 回答 1

0

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

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

由于变量_schoolService in是静态的,因此对页面的所有请求都将使用PrintList相同的实例。如果您真的希望它是瞬态的,请删除“静态”关键字。ISchoolManagerPrintList

关于发布组件,请看这篇文章

顺便说一句:AddComponent不推荐使用 -style 注册,请Register()改用。

于 2010-08-28T23:59:18.707 回答