我正在寫一個任務執行引擎,我遇到了一些問題,關於什麼是適當的方法來確保當我在任務執行環境中使用Castle.Windsor(ver 2.5.1.0)時, Parallels-Library系統。在使用Castle.Windsor和Task Parallels Library的Windows服務中,什麼是適當的生活方式和發佈過程?
我已經包括了一個高度簡化的僞代碼示例,我在帖子結尾處做了些什麼。
這裏是我的問題
- Castle.Windsor沒有一個「PerTask」的生活方式,並給予TPL使用線程的方式,我相信PerThread生活方式將無法正常工作。那麼什麼是適當的生活方式?
- 如果我強制TPL成爲Task-Per-Thread機制,那麼我的理解是,調用PerThread生活方式的Release將不會實際釋放任何東西,直到容器被處置掉,目前我只有一個容器永遠。有沒有更好的方法來設置我的容器來支持PerThread?
- 在下面的示例中,我還指出了三個可以在容器上調用釋放的潛在位置。根據我讀過的大部分內容,我應該很少需要自己致電發佈,但如果我不在這些地方打電話,那麼這些註冊如何處置?
的服務:
class Service : ServiceBase
{
IWindsorContainer _container;
Engine _engine;
public Service()
{
_container = new WindsorContainer();
_container.Register(Component.For<Engine>().ImplementedBy<Engine>().LifeStyle.Singleton);
_container.Register(Component.For<ISession>().UsingFactoryMethod(() => SessionFactory.Get());
_container.Register(Component.For<IDataAccess>().ImplementedBy<SqlDataAccess>());
_container.Register(Component.For<IWorker>().ImplementedBy<DocumentWorker>());
_container.Register(Component.For<IDependency>().ImplementedBy<SomeDependency>());
}
protected override void OnStart(string[] args)
{
_engine = _container.Resolve<Engine>();
_engine.Start();
}
protected override void OnStop()
{
_container.Release(_engine); //1?
}
}
「引擎」:
class Engine
{
IWindsorContainer _container
public Engine(IWindsorContainer container)
{
_container = container;
}
public void Start()
{
Task.Factory.StartNew(() => Work());
}
public void Work()
{
var worker = _container.Resolve<IWorker>();
worker.DoWork();
_container.Release(worker); //2?
}
}
工人任務:
class Worker : IWorker
{
IDataAccess _accessor;
IWindsorContainer _container;
public Worker(IDataAccess accessor, IWindsorContainer container)
{
_accessor = accessor;
_container = container;
}
public void DoWork()
{
var depen = _container.Resolve<IDependency>();
//DoWork
_container.Release(depen); //3?
}
}
謝謝,我會很高興,如果進一步闡述需要更多細節。
如何註冊組件瞬態?然後,每次調用組件的解析時,都會收到一個新實例。 – Simon
主要是因爲,雖然這個例子並沒有完全顯示出來,但我並不想讓所有的東西都是瞬態的。但這是一個可能的解決方案。 – Dugan
似乎是http://stackoverflow.com/questions/5226659/castle-custome-lifestyle-per-resolve和http://stackoverflow.com/questions/3986747/how-to-reuse-a-transient - 依賴於同一上下文 - 與城堡 - windsor-di-conta –