2017-02-14 78 views
1

第一個問題:Asp.net核心,我不基本問題理解

services.AddMemoryCache(); // in Startup config 
public class AController 
{ 
public AController(IMemoryCache cacheA) { } 
} 

public class BController 
{ 
public BController(IMemoryCache cacheB) { } 
} 

問題是cacheA相同cacheB

我想有私人API(羣集連接)和公共API(暴露於前端) 如何在保持DI模式友好的同時將它們分開?

第二個問題;

我想有一個通過HTTP 要求一些外部的Web服務器,其結果將在該服務中,也存儲在數據庫 所以我們首先查詢localCache然後查詢數據庫緩存服務,然後查詢外部服務器

該服務的結果將用於控制器併發送到前端

如何使用所有花哨的asp.netcore模式實現這樣的事情? 緩存必須是ONE(單例),所以我們不要浪費DB請求

?增加這種服務的services.SCOPED <>但隨後如何保持其高速緩存同樣爲每個實例(有些單身DI?還是靜態的MemoryCache實例嗎?) 我不知道,不該死的想法乞求幫助

在節點.js文件我會做這一切在一兩分鐘,但微軟哎

+1

在源一看會回答你所有的問題:https://github.com/aspnet/Caching/blob/efbbdc5e0a8c8a664ea34cd41220d084b6906f57/src/Microsoft.Extensions.Caching.Memory/MemoryCacheServiceCollectionExtensions.cs#L76-L86 – Tseng

+0

大聲笑,這是一個很好的,這將是一個很好的功能,如果VS的(Peek定義 - Alt F12)可以爲您提供源代碼 – gdpm

回答

1

定義二級緩存接口:

public interface IPrivateMemoryCache: IMemoryCache 
{ 
} 

public interface IPublicMemoryCache: IMemoryCache 
{ 
} 

public class AController 
{ 
    public AController(IPrivateMemoryCache cacheA) { } 
} 

public class BController 
{ 
    public BController(IPublicMemoryCache cacheB) { } 
} 

現在你可以爲你的IoC容器定義不同的實例化規則。

+0

這樣做只有在兩個接口定義不同的契約時纔有意義,換句話說, 'IMemoryCache'接口會違反[Liskov替換原則](https://en.wikipedia.org/wiki/Liskov_substitution_principle)。 – Steven

+0

不要以爲你完全獲得LSP。它不僅與數據成員的數據類型和名稱有關,而且還與行爲*子類型有關(例如,[標記接口]的使用(https://en.wikipedia.org/wiki/Marker_interface_pattern )所有成員都有相同的成員)。如果設計需要獨立的私有和公共緩存,則它們在邏輯上是不同的。 –

+0

我認爲我理解LSP就好:)而且你是對的,這完全是關於行爲。這裏的問題是,這些實現的行爲與消費者的角度不一樣。 – Steven