是否可以在不实现ITableEntity或继承TableEntity的情况下创建自定义实体?
如果我正在实施ITableEntity,那么它迫使我实施其他一些我不想实施的方法。
如果我从TableEntity继承我的自定义实体,那么我需要在将它传递给表操作之前将其新建,然后引入无法模拟的直接依赖,并且我的控制器类变为非可测试的。
我想要做的就是创建我的自定义实体并保存在Azure表存储中。
答案 0 :(得分:1)
是否可以在不实现ITableEntity或继承TableEntity的情况下创建自定义实体?
严厉地说:不
你需要实现这个接口或者这个类固有的原因是TableOperation以ITableEntity
作为参数。
如果您真的希望只能使用自己的类和接口,那么您可以自己实现与Azure服务的通信。例如,here是插入实体操作的描述。您将不得不编写一个包装器,它将复制Microsoft库提供的现有功能。
但看起来你正试图做一些奇怪的事情 第一个奇怪的事情是您正在尝试测试控制器。通常你不会这样做。你能用什么样的控制器,为什么要测试它们呢? 第二个奇怪的事情是你试图传递一些继承自TableEntity或实现ITableEntity的东西到某个不是存储库的方法或者只在数据层中工作的某个类。
通常,您永远不会使用实现ITableEntity的东西或从数据层类之外的TableStorage继承。该类应仅从某些存储中读取并检索映射到业务对象数据或写入某些存储,将 DTO或业务层对象本身或简单类型作为参数作为字符串& #39; s,int' s,DateTime' s 。这样的课程是不可测试的。在它的数据层,您应该测试业务逻辑或某些与原始数据和数据存储一起使用的层。
因此,考虑在您的系统中引入一个新的抽象级别 - 存储库或某些类型,它将与存储一起使用,返回业务对象。这种抽象应该有一个可以轻松模拟和测试的界面。此类的方法应采用业务层对象,DTO或.NET类型的对象。它仅适用于DI,不适用于测试。这些课程通常没有经过测试。
答案 1 :(得分:1)
部分答案已过时。对的,这是可能的。您可以使用存储sdk中的TableEntityAdapter
类,并使用自定义对象对其进行实例化。该对象不需要继承TableEntity
类或实现ITableEntity
接口:
https://docs.microsoft.com/en-us/dotnet/api/microsoft.windowsazure.storage.table.tableentityadapter-1?view=azure-dotnet