我正在使用 .Net core Web 應用程序。在我的應用程序中,我使用它Lazy來將大量耗時的操作緩存到 Lazy 值中:interface IFoo{ Lazy<Task<int>> MyLazy { get; set; }}class Foo : IFoo{ public Lazy<Task<int>> MyLazy { get; set; } public Foo() { MyLazy = new Lazy<Task<int>>(() => /*heavy operation*/ Task.FromResult(3)); }}當然,我不想在構造函數(shù)中運行繁重的操作,但僅在需要時才運行,然后緩存該值。恕我直言,懶惰的財產(chǎn)很好。值得一提的是:我確實計劃使用.AdddSingleton<Ifoo,Foo>.所以現(xiàn)在我可以注入IFoo并獲得MyLazy財產(chǎn)。但我不想set公開。我嘗試將其更改為protected set但出現(xiàn)錯誤:問題:我想我在這里走錯路了。如何創(chuàng)建 DI 接口類來公開重載操作的緩存屬性?(不允許更改,外部Foo)完整的關閉:我們需要從數(shù)據(jù)庫加載一些要在整個應用程序中使用的行,并且不想每次都加載它們。
1 回答

GCT1015
TA貢獻1827條經(jīng)驗 獲得超4個贊
您可以在 中僅聲明getter IFoo,如下所示:
public interface IFoo
{
Lazy<Task<int>> MyLazy { get; }
}
然后,從 C# 6 開始,您可以實現(xiàn)一個只讀自動屬性,它將實現(xiàn)接口成員并提供可在構造函數(shù)中使用的 setter:
public class Foo : IFoo
{
public Lazy<Task<int>> MyLazy { get; }
public Foo()
{
MyLazy = new Lazy<Task<int>>(() => Task.FromResult(3));
}
}
或者,如果您想在類中的其他位置設置它,您可以更改Foo.MyLazy為:private set
public class Foo : IFoo
{
public Lazy<Task<int>> MyLazy { get; private set; }
// ...
}
- 1 回答
- 0 關注
- 154 瀏覽
添加回答
舉報
0/150
提交
取消