簡體   English   中英

C#接口經驗法則返回的數據類型

[英]C# Interfaces rules of thumb for data types returned

我正在使用C#開發一個應用程序,該應用程序基本上是一個接口,可以通過REST API接收數據或將數據返回到各種外部應用程序/客戶端。 應充分靈活地設計應用程序,以便僅通過更改配置文件即可換出后端數據存儲以指向新的數據存儲,或者可能在可用數據存儲之間循環以在不同格式的數據存儲上查找數據。 數據的總體結構大致是一個文件系統/樹,其中將自定義數據附加到某些節點以進行搜索,權限...等。

例如,我們可能在SQL DB中擁有實時生產數據,但是有可能會將一些舊數據存儲在網絡共享中的扁平化的csv文件中,並且希望接口的新實現包含在將來(這些的數據庫實現將已經定義,這意味着如果某個東西的GUID類型的pkid,我們將無法更改。)

我在計划此過程時遇到的問題是這些后端數據格式具有不同的唯一ID ...等。 因此,接口可能具有以下方法:

public long CreateFolder(long parent, string folderName);

對於使用整數或長Id的東西來說,這會很好用,但是如果CreateFolder操作的返回是guid或文件名(字符串),則接口實現的使用者將遇到問題。 還希望盡可能少地更改“業務邏輯”層,並在最低級別的數據層進行更改。

我的第一個想法是創建所有返回字符串的接口,並讓數據層實現將字符串轉換為本機數據類型,但這對我來說似乎很丑。

對這樣的事情有什么指導嗎?

編輯:要添加這是我用於數據庫接口的模式。

https://softwareengineering.stackexchange.com/questions/301362/how-are-abstract-database-interfaces-write-to-support-multiple-database-types/301371

現在,我傾向於使用string,int和long重載所有接口,然后在接口實現中處理轉換/轉換。

您需要抽象出差異。 簡單地說,將簽名更改為:

public IFolder CreateFolder(long parent, string folderName);

將IFolder定義為C#接口,如下所示:

public interface IFolder { // Example method to be implemented by inheritors. void EnumerateFiles(); }

每個后端數據格式將需要自己的具體類,該類繼承並實現IFolder。 CreateFolder調用者確實也知道它在談論哪個具體的后端類,因為它僅看到抽象的IFolder接口。

要求:

  1. 可以選擇在不同來源中存儲/獲取數據
  2. 易於更改連接使用方式。

解:

我認為在您的情況下,使用存儲庫模式和一些決定使用哪個存儲庫的Fabric會更好。 另外,您可以將存儲庫創建為通用存儲庫,以便快速更改適用於哪種模型的選項。

public class IRepository<T> where T : class
{
   T Save(T model);
   IEnumerable<T> Get(Expression... condition);
   //another methods.
}

DbRepository<T> :IRepository<T>
{
}
CsvRepository<T> :IRepository<T>
{
}

我建議您一個可能的解決方案:

public abstract class AbstractController<T> : ApiController {
    [HttpPost] // Or GET
    [Route("createfolder")]
    public IHttpActionResult CreateFolder<T>(long parent, string foldername) {
        T result = YourClass.CreateFolder<T>(parent, foldername);

        return Ok(result);
    }
}

[RoutePrefix("api/sql")]
public abstract class SqlController : AbstractController<long> { }

[RoutePrefix("api/csv")]
public abstract class SqlController : AbstractController<string> { }

這可能嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM