温莎城堡重新创建实例

本文关键字:创建 实例 新创建 城堡 | 更新日期: 2023-09-27 18:34:37

我正在尝试在每次WCF调用后释放我的所有业务逻辑服务,并尝试使用温莎来实现它(Ninject只是不起作用(,我有以下容器类:

    public class LDSWindsorContainer : WindsorContainer
    {
        public LDSWindsorContainer()
        {
            AddFacility<WcfFacility>().
                Register(
                    Component.For<IDomainService>().ImplementedBy<DomainService>().LifeStyle.PerWcfOperation(),
                    Component.For<IChangeLogService>().ImplementedBy<ChangeLogService>().LifeStyle.PerWcfOperation(),
                    Component.For<ILogService>().ImplementedBy<LogService>().LifeStyle.PerWcfOperation(),
                    Component.For<ICentreInformationService>()
                        .ImplementedBy<CentreInformationService>()
                        .LifeStyle.PerWcfOperation().OnCreate(x=>Debug.WriteLine("Created")),
                    Component.For<ICentreService>().ImplementedBy<CentreService>().LifeStyle.PerWcfOperation(),
                    Component.For<ITimeZoneService>().ImplementedBy<TimeZoneService>().LifeStyle.PerWcfOperation(),
                    Component.For<IBrandService>().ImplementedBy<BrandService>().LifeStyle.PerWcfOperation(),
                    Component.For<IPricingService>().ImplementedBy<PricingService>().LifeStyle.PerWcfOperation(),
                    Component.For<IDirectoryService>()
                        .ImplementedBy<DirectoryService>().LifestyleSingleton());
        }
    }

除了 IDirectoryService 及其实现之外的所有对象都是我的业务逻辑服务,最后一个是 WCF 服务本身,我有以下 Application_Start(( 方法:

         public class Global : System.Web.HttpApplication
         {
             protected void Application_Start(object sender, EventArgs e)
             {
                 var container = new LDSWindsorContainer();
                 ...
             }
         }

我的服务的构造函数如下所示:

            private ILogService Logger { get; set; }
            private IDomainService DomainService { get; set; }
            private ICentreInformationService CentreInformationService { get; set; }
            private ICentreService CentreService { get; set; }
            private ITimeZoneService TimeZoneService { get; set; }
            private IBrandService BrandService { get; set; }
            private IPricingService PricingService { get; set; }
            public DirectoryService(IBrandService brandService, ITimeZoneService timeZoneService, ICentreService centreService, ICentreInformationService centreInformationService, IDomainService domainService, ILogService logger, IPricingService pricingService)
            {
                BrandService = brandService;
                TimeZoneService = timeZoneService;
                CentreService = centreService;
                CentreInformationService = centreInformationService;
                DomainService = domainService;
                Logger = logger;
                PricingService = pricingService;
            }

我的 DirectoryService.svc 和 Web.config 中也有相应的行 -

Factory="Castle.Facilities.WcfIntegration.DefaultServiceHostFactory, Castle.Facilities.WcfIntegration    

 <system.webServer>
        <modules runAllManagedModulesForAllRequests="true" >
          <add name="PerRequestLifestyle" type="Castle.MicroKernel.Lifestyle.PerWebRequestLifestyleModule, Castle.Windsor" />
        </modules>
 </system.webServer>

到目前为止的问题是:我的实例被解决一次(对于第一次调用(,工作正常,在调用端被释放,并且没有为所有即将到来的调用重新实例化,所以基本上我只是在使用处置对象时得到一个例外,任何想法都非常感谢,提前谢谢你。

温莎城堡重新创建实例

好的,

所以经过一番挣扎,我能够在这里找到一个完美的答案 -

我的容器设置:

     AddFacility<TypedFactoryFacility>().Register(Component.For<IDomainService>().ImplementedBy<DomainService().LifeStyle.PerWcfOperation(),
     AddFacility<WcfFacility>().Register(Component.For<IDirectoryService>().ImplementedBy<DirectoryService>().LifestyleSingleton());

其中 IDomainService 是我想要在每个请求后释放的业务逻辑服务,IDirectoryService 是我的 WCF 服务。

我的服务节点

    public DirectoryService(Func<IDomainService> domainService)
    {
        DomainServiceFactory = domainService;
    }

和一些糖以避免所有调用重命名:

    private Func<IDomainService> DomainServiceFactory { get; set; }
    private IDomainService DomainService
    {
        get { return DomainServiceFactory(); }
    }