そこにいるIocの達人に質問があります。私は同僚と協力して、CastleWindsorIoCに心を包み込んでいます。asp.NetWebフォーム内の静的ドメインサービスオブジェクトについて意見の相違があります。コンテナを取得するインフラストラクチャ層に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);
}
}
私には、これはすべてのセッションに同じインスタンスを提供するように見えます。それは確かに悪いでしょう!私の同僚は、すべてのドメインサービスが一時的とマークされているため、各ページリクエストが新しいインスタンスを取得すると考えています。
ガベージコレクション用にリリースされていない一時的とマークされたオブジェクトによるメモリリークについても少し読みました。これはCastleWindsorの最新リリースで対処されていますか、それともオブジェクトを明示的にリリースする必要がありますか?もちろん、現在のところ、すべてのオブジェクトは静的であり、これは関係ありません。