C# 关于温莎城堡的几个问题

C# 关于温莎城堡的几个问题,c#,castle-windsor,castle,C#,Castle Windsor,Castle,关于温莎城堡的几个问题 我提供的服务如下所示: public interface IMysRepository { ISomeObject GetById(int id); } public interface IMyService { ISomeObject GetById(int id); } public class MyService : IMyService { MyService(IMysRepository repository) {

关于温莎城堡的几个问题

我提供的服务如下所示:

public interface IMysRepository
{
    ISomeObject GetById(int id);
}

public interface IMyService
{
     ISomeObject GetById(int id);
}

public class MyService : IMyService
{
     MyService(IMysRepository repository)
     {
          _repository = repository;
     }


     public ISomeObject GetById(int id)
     {
          return _repository.GetById(id);
     } 

     IMysRepository _repository
}
我认为最好的办法是把它保存在容器中,但不确定我应该把它保存为单态还是瞬态。它保持的唯一状态是存储库。我想最好的方法是作为一个单身汉,代码看起来也更干净。例如:

//Singleton version.
var service = container.Reslove<IMyService>();
var obj = IMyService.GetById(100);
//单例版本。
var service=container.Reslove();
var obj=IMyService.GetById(100);
vs

//暂时版本。
var service=container.Reslove();
尝试
{
var obj=IMyService.GetById(100);
}
最后
{
集装箱.放行(服务);
}

我还想知道的另一件事是Castle线程安全吗?

它实际上取决于存储库的编码方式。阅读以了解不同生活方式的组成部分是如何相互作用的。我总是试图使我的组件线程安全,无状态,这样我就可以使它们成为单例,这使一切变得更简单

顺便说一句:您应该尽量避免调用Resolve()


是的,温莎是线程安全的。

谢谢您的回复。我不完全理解你所说的“不使用解析”是什么意思,因为我几乎在做博客上说的每一件事。另外,现在我只是使用ADO.NET从数据库中获取数据。我想我应该用Transient。如果你不调用.Release,那么你就有资源泄漏,对吗?@Michael:理想情况下,你应该只在根站点调用Resolve和Release。关于发布,简而言之,您应该发布您明确解析的内容。有关更多详细信息,请参阅。
//Transient version.
var service = container.Reslove<IMyService>();
try
{
     var obj = IMyService.GetById(100);
}
finally
{
   container.Release(service);
}