0

そこにいる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の最新リリースで対処されていますか、それともオブジェクトを明示的にリリースする必要がありますか?もちろん、現在のところ、すべてのオブジェクトは静的であり、これは関係ありません。

4

1 に答える 1

0

サービス ロケーターBLServiceFactoryです。サービスロケータを使用する場合は、独自のものではなくCommonServiceLocatorを使用することをお勧めします。コンポーネントの登録は、サービス ロケーター内には属しません。

投稿したコードでは、[Transient]属性でマークしない限り、これらのコンポーネントが一時的であるという言及はありません。そうしないと、これらのコンポーネントはシングルトンになります。これは、Windsor のデフォルトのライフスタイルです。

_schoolService inの変数PrintListは静的であるため、の同じインスタンスがページISchoolManagerへのすべてのリクエストに使用されPrintListます。本当に一時的なものにしたい場合は、「静的」キーワードを削除してください。

コンポーネントのリリースについては、この記事を参照してください。

ところで: AddComponent-style 登録は非推奨ですRegister()。代わりに使用してください。

于 2010-08-28T23:59:18.707 に答える