首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#接口返回数据类型的经验法则

C#接口返回数据类型的经验法则
EN

Stack Overflow用户
提问于 2019-02-16 00:31:25
回答 3查看 104关注 0票数 0

我正在用C#开发一个应用程序,它基本上是一个接口,可以通过REST API (很可能)向各种外部应用程序/客户端获取数据或将数据返回给这些应用程序/客户端。应用程序的设计应该足够灵活,只需更改配置文件即可换出后端数据存储,以指向新的数据存储,或者可能在可用数据存储中循环,以便在不同格式的数据存储中查找数据。数据的整体结构大致是一个文件系统/树,其中自定义数据附加到一些用于搜索的节点permissions...etc。

例如,我们可以将实时生产数据存储在SQL DB中,但一些遗留数据可能会存储在网络共享上的扁平化csv文件中,并且希望将来包含接口的新实现(这些接口的数据库实现可能已经定义好了,这意味着如果某个东西有一个类型为GUID的pkid,我们就不能更改它)。

我在规划时遇到的问题是,这些后端数据格式具有不同的唯一ids...etc。因此,该接口可能具有以下方法:

代码语言:javascript
运行
复制
public long CreateFolder(long parent, string folderName);

对于使用整数或长Ids的对象,这将很好地工作,但是如果CreateFolder操作的返回是guid或文件名(字符串),则接口实现的消费者将会有问题。我们还希望尽可能少地更改“业务逻辑层”,并在最低级别的数据层进行更改。

我的第一个想法是创建所有返回字符串的接口,并让数据层实现处理将字符串转换为本机数据类型,但这对我来说似乎很难看。

对这样的事情有什么指导吗?

编辑:添加这是我用于DB接口的模式。

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

现在,我倾向于用string、int和long重载所有接口,然后在接口实现中处理强制转换/转换。

EN

回答 3

Stack Overflow用户

发布于 2019-02-16 00:46:02

你需要抽象出不同之处。在最简单的情况下,将签名更改为:

public IFolder CreateFolder(long parent, string folderName);

将IFolder定义为C#接口,如下所示:

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

每种后端数据格式都需要自己的具体类来继承和实现IFolder。因为CreateFolder调用者只看到抽象的IFolder接口,所以它也知道它在与哪个具体的后端类通信。

票数 0
EN

Stack Overflow用户

发布于 2019-02-16 00:46:11

要求:

  1. 可以选择在不同的源中存储/获取数据
  2. 可以轻松更改要使用的连接。

解决方案:

我认为在你的案例中,使用Repository pattern和一些由谁决定使用哪个存储库的Fabric会很好。此外,您可以将存储库创建为通用存储库,以便快速更改要工作的模型的选项。

代码语言:javascript
运行
复制
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>
{
}
票数 0
EN

Stack Overflow用户

发布于 2019-02-16 00:46:56

我向你提出了一个可行的解决方案:

代码语言:javascript
运行
复制
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> { }

这是一种可能的方法吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54713438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档