gpt4 book ai didi

.net - 在服务层存储状态

转载 作者:行者123 更新时间:2023-12-02 00:29:15 27 4
gpt4 key购买 nike

我有一个基本服务类,我有一堆服务,在服务类上存储数据是好是坏?

例如:

public interface IFunkyService
{
void AddComment(int quoteid, string comment);
void SetProirirty(int quoteid, Importance proirity);
}

public class FunkyService : CustomServiceBase, IFunkyService
{

private readonly IRepo _repo;
private readonly IUserSession _user;
public FunkyService(IRepo repo, IUserSession user)
{
_repo = repo;
_user = user;
}


public void SetProirirty(int quoteid, Important priority)
{

//get quote object then persists

}

public void AddComment(int quoteid, string comment)
{

//get quote object then persists

}

}

我可以简单地使用一个私有(private)方法来存储类中的引用对象吗?例如

private Quote _quote {get;set;} //store on the class???

private void GetQuote(int quoteid)
{
_quote = _repo.single(quoteid); //or whatever
}

最佳答案

请注意,类中的值只会与服务对象本身一样存在。对服务的每个请求都会创建和销毁服务对象,因此 Quote 只会在单个请求期间有效。对于类似的东西,我能看到的唯一目的是每个请求缓存(即,在单个请求期间,您引用 Quote 对象五次。您应该只需要从支持中实际查找它存储一次)。

  1. 客户端向服务器发起请求
  2. 服务器实例化FunkyService
  3. 客户端调用 GetQuote
  4. 服务器在类中填充Quote
  5. 客户完​​成通话。
  6. 服务器完成请求,处理来自 (2) 的 FunkyService 对象。
  7. Quote 的值不再存储在类中,因为该对象已不存在。

编辑:您这样做的原因似乎是在一个地方检索引用对象,但不会一遍又一遍地调用它(即制作多个当只需要一个时向数据库请求)。您可以实现可缓存属性设计模式以在不使用类变量的情况下拥有每个请求的缓存。它看起来像这样:

private Dictionary<int, Quote> _quoteCache = 
new Dictionary<int, Quote>(); // cache storage - NEVER ACCESS DIRECTLY

public Quote GetQuote(int quoteid)
{
// cache is invalid, so populate
if (!_quoteCache.ContainsKey(quoteid))
{
_quoteCache.Add(quoteid, _repo.single(quoteid));
}

// return back to caller
return _quoteCache[quoteid];
}

在上面的示例中,缓存存储从数据库中检索到的每个唯一的 quoteid。因此,如果您连续五次调用 GetQuote(5),它只会通过 _repo 从数据库中检索一次。但是,如果您调用 GetQuote(6),那么它会再次进入数据库,因为缓存中没有该引用。之后,5和6仍然保存在缓存中,直到服务请求结束并被释放。

Edit2:在您提供的示例中:

var t = GetTags(_quote);
// then do something with t, I may pass to another method:
if(IsClosed(_quote)){}

不是引用类变量,而是让您的存储库返回一个 Quote 对象并传递该引用,如下所示:

private Quote GetQuote(int quoteid)
{
return _repo.single(quoteid); //or whatever
}

// other code
var q = GetQuote(quoteid); // get the quote once
var t = GetTags(q); // q doesn't have to retrieve from repo again
if (IsClosed(q)) {}
// etc.

关于.net - 在服务层存储状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7688737/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com