Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

更新Media类的写法。我觉得应该把调用方法所需参数作为类的属性,这样才是真正的面向对象。 #39

Closed
wants to merge 698 commits into from

Conversation

zeusro
Copy link

@zeusro zeusro commented Aug 20, 2014

/// <summary>
///  上传/下载媒体基类
/// </summary>
public class Media
{
    /// <summary>
    /// 调用接口凭证 
    /// </summary>
    public string access_token { get; set; }

    /// <summary>
    /// 媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb) 
    /// </summary>
    public BaseInfoTYPE type { get; set; }

    /// <summary>
    /// 完整路径+文件名
    /// </summary>
    public string fileName { get; set; }

    /// <summary>
    /// 下载时用到
    /// </summary>
    public string mediaId { get; set; }


    /// <summary>
    /// 上传媒体文件
    /// </summary>
    /// <param name="accessToken"></param>
    /// <param name="type"></param>
    /// <param name="file"></param>
    /// <returns></returns>
    public  UploadResultJson Upload()
    {
        var url = string.Format("http://file.api.weixin.qq.com/cgi-bin/media/upload?access_token={0}&type={1}", access_token, type.ToString());
        var fileDictionary = new Dictionary<string, string>();
        fileDictionary["media"] = fileName;
        return HttpUtility.Post.PostFileGetJson<UploadResultJson>(url, null, fileDictionary, null);
    }


    /// <summary>
    /// 下载多媒体文件,至少要实例化access_token,type,fileName,mediaId三个属性
    /// </summary>
    /// <param name="accessToken"></param>
    /// <param name="mediaId"></param>
    /// <param name="fileName">完整路径E:\testpic_{0}.jpg</param>
    /// <returns></returns>
    public bool DownloadMedia()
    {
        using (MemoryStream ms = new MemoryStream())
        {
            var url = string.Format("http://file.api.weixin.qq.com/cgi-bin/media/get?access_token={0}&media_id={1}",
             access_token, mediaId);
            Get.Download(url, ms);
            if (ms.Length < 1)
            {
                return false;
            }
            using (FileStream fs = new FileStream(fileName, FileMode.Create))
            {
                ms.Position = 0;
                byte[] buffer = new byte[1024];
                int bytesRead = 0;
                while ((bytesRead = ms.Read(buffer, 0, buffer.Length)) != 0)
                {
                    fs.Write(buffer, 0, bytesRead);
                }
                fs.Flush();
            }

        }
        return File.Exists(fileName);
    }



}

@zeusro zeusro changed the title Media 更新Media类的写法。我觉得应该把调用方法所需参数作为类的属性,这样才是真正的面向对象。 Aug 20, 2014
@JeffreySu
Copy link
Owner

感谢提交代码!看了一下,个人不太认同这种写法,比如当用户忘记传入accessToken或者file等其他参数的时候,这个方法会发生异常,也就是说使用者必须非常记住每一个方法需要用到什么参数,然后传入才能成功,不可取。而且粒度太大,不利于测试。

@JeffreySu JeffreySu closed this Aug 22, 2014
@zeusro
Copy link
Author

zeusro commented Aug 25, 2014

本来调用接口就要明白参数是什么,你方法参数里面用一堆字段,那微信接口变更是不是再度加个参数跟在后面?参数应该应该尽可能是对象,或者照我理解,干脆就弄成对象的属性。再不然构造函数注入参数。这样一切不就很明白了吗?Waiting for your answer!

@zeusro
Copy link
Author

zeusro commented Aug 25, 2014

    [TestMethod]
    public void GetTest()
    {
        var accessToken = AccessTokenContainer.GetToken(_appId);

        UploadTest();//上传

        using (MemoryStream ms = new MemoryStream())
        {
            Media.Get(accessToken, mediaId, ms);
            Assert.IsTrue(ms.Length > 0);

            //保存到文件
            var fileName = string.Format(@"E:\testpic_{0}.jpg", DateTime.Now.Ticks);
            using (FileStream fs = new FileStream(fileName, FileMode.Create))
            {
                ms.Position = 0;
                byte[] buffer = new byte[1024];
                int bytesRead = 0;
                while ((bytesRead = ms.Read(buffer, 0, buffer.Length)) != 0)
                {
                    fs.Write(buffer, 0, bytesRead);
                }
                fs.Flush();
            }

            Assert.IsTrue(File.Exists(fileName));
        }
    }

看看你这段测试,业务逻辑都包进测试里面了。我表示从来没见过这样的测试写法。我所了解的测试从来都不是这样拖泥带水的,从来都只有3步:
1new 对象,装填字段:
2调用方法;
3断言方法返回值。
本来MVC模式,所有业务逻辑都在领域对象上,控制器只是一个纽带。你方法写不齐是不是又要控制器给你补全,然后你真的确定你能对模型,视图,控制器分开测试吗?

@JeffreySu
Copy link
Owner

你好,分别回答一下:
1、参数有参数的用途,传参和面向对象是不矛盾的,如果为了面向对象而面向对象,反而会使系统变得更加复杂,例如你提出的做法,弊端我已经解释过了,坦白地说这种设计是非常糟糕的。

2、这一段测试代码针对Media.Get的测试,其实到Assert.IsTrue(ms.Length > 0);就已经结束了,下面只是给大家演示一下如何保存ms里面的东西(之前有人提到过这个问题),并且确定这种方式是有效的( Assert.IsTrue(File.Exists(fileName)))。实际操作灵活使用就行了。

非常感谢!

JeffreySu added a commit that referenced this pull request Oct 28, 2019
d8c85736c Merge pull request #42 from JeffreySu/Developer
6c68657e5 更新引用
90cc0c594 Merge pull request #41 from JeffreySu/Developer
6cdc99625 Merge branch 'Developer' of https://github.com/JeffreySu/WeiXinMPSDK into Developer
24c7cb59f 更新NET Core 2.2 sample
3abf7b7cc .net 4.5 sample 升级最新 nuget 包
fa348566c modify
4966e37a4 x.102 发布正式版
c2c000ed7 Sample v4.6.0 添加小程序订阅消息演示
6edf21b8e WxOpen v3.7.102 添加订阅消息接口 #1997 感谢 @luoxy123
4b7bd5405 x.102-preview7.8.1  小程序审核事件移动到Senparc.Weixin.WxOpen,第三方平台-扫码关注组件,小程序支付后获取unionid #1991 感谢 @mc7246
43bd27ba6 Merge pull request #1991 from mc7246/master
85fa4a979 更新Sample
1f71d8015 更新 .net core 2.2 Demo
54af590ea 使用新版本 NeuChar,提升 MessageHandler 处理效率 2 倍以上(异步方法)
eeecbcf5d 小程序审核事件移动到Senparc.Weixin.WxOpen,第三方平台-扫码关注组件,小程序支付后获取unionid
251a37551 改造消息模拟器,使用异步方法,提高测试准确性
2a69c91d2 调整组测过程,避免可能出现的因为注册顺序问题导致的缓存异常
a99a68a33 preivew v7.7.8
e827adaaf 使用新版本 CO2NET 和 NeuChar
8284580bc Sample v4.5.6, 修改 OnlyAllowEcryptMessage 提示信息
1d0e76d5e preview 7.7,Sample v4.5.6,完成加密消息转发
00a307380 添加 onlyAllowEcryptMessage 属性,进一步提高安全性,同时优化了 RequestMessage 日志储存机制
30798ede2 Sample v4.5.5 使用 MessageHandler.OnlyAllowEcryptMessage 属性,进一步提高安全级别
cfab4e935 Sample v4.5.4 提高安全性
95a08f07f 使用 NeuChar v1.0.102-preview7.5,更新示例
a61d3b11a preview7.1
eda668697 更新 NeuChar v1.0.102-preview7.4.4,继续测试优化企业微信消息ji
caac57d73 升级到 NeuChar v1.0.102-preview7.4.4,解决企业号等验证问题
87856aac9 新版本.102 preview7;Sample v4.5.0,,公众号、小程序、企业微信全面支持中间件消息处理,并开始以异步方法优先,进行升级
6fc01a56c 优化 Work 消息加密相关代码
2198c4722 升级NeuChar新版,更新中间件消息验证页面的提示内容
02bfd9d79 完善异步方法改写
8c9b66f5b WxOpen 部分完成异步MessageHandler改造
45ad3ad71 升级到 NeuChar 新版本,开始异步方法优先
b4cd15eb8 升级到新版本NeuChar,提供更好的验证提示
2915535c6 完成企业号MessageHandler中间件
e5f07a05f Sample v4.4.12,小程序 MessageHandler 使用中间件
f2d2999ca Sample v4.4.11,完善消息模拟器,使用新版本 MessageAgent
8e9790358 升级 NeuChar;Sample v4.4.10
590008f6d 优化 MessageHandler 中间件,完成 MP 中间件搭建,配置代码可简化到1行
07b9923e1 完成 Messagehandler 中间件升级
d8e76da7b 更新 NeuChar,升级 中间件,测试成功,继续优化
0cb372848 进一步抽象中间件,将扩展方法移植到NeuChar
6b50c7186 中间件基类移植到NeuChar,其他模块以此作为基类进行扩展
53b002625 升级到NeuChar preview3
c0cc79bbd Register 注册过程自动添加更多 SenparcSettingItem 信息
c959f6f51 提供 MP MessageHandler 中间件配置方式(测试版)
35dc1f95b 修改小程序 代码
a02d2f24a 更新小程序Demo
5745cff57 升级 Cache 相关 的 .net core 3.0 独立项目
2843ae30d 升级 .net core 3.0 独立项目 csproj 文件
b8a48d667 升级 .net core 3.0 独立项目 csproj 文件
e6d4e4218 添加  NETCOREAPP3_0 条件编译
25e3aada3 WxOpen v3.7.101 提供 .Net Core 3.0 独立版本
4d372848a 升级到最新NeuChar版本
54b874cae Merge branch 'Developer' of https://github.com/JeffreySu/WeiXinMPSDK into Developer
b0b7ee1a2 修改 .NET Core 3.0 单元测试项目
2154c9e01 更新 .net 4.5 项目版本号
e5bd1e99d Senparc.Weixin SDK v6.6.0 使用最新版本 Neuchar、CO2NET,支持 .NET Core 3.0
e320a0563 fix bug:MessageContext.GetRequestEntityMappingResult() 方法可能出现的空值情况 #1929 #1930 感谢  @tangyangming @gendou
b7c01e426 更新 NeuChar、CO2NET,支持 .NET Core 3.0
fd3050697 升级新版本 NeuChar,解决上下文缓存反序列化时APP状态的一个 bug
b24b8eb6e .net 4.5 sample 同步新版本号
4cab1d29d Merge branch 'Developer' of https://github.com/JeffreySu/WeiXinMPSDK into Developer
5f3217f6e .net 4.5 Sample 更新 NeuChar 库
80511ef68 Merge branch 'Developer' of https://github.com/JeffreySu/WeiXinMPSDK into Developer
a96421d58 .net core Sample 升级 NeuChar 包
852458a07 .net 4.5 项目完成分布式上下文升级。单元测试通过。
9306e8f58 更新 neuchar
c3726feea .net 4.5 升级基础库,支持分布式上下文
84a4415f2 提供带符号的 nuget 包(.snupkg)
d2db98338 preview4
a5f285007 优化 MessageHandler 的上下文记录,统一到基类中。
0009461d2 升级NeuChar库
d9d3c4b07 升级SDK
8018903f6 WxOpen完成新MessageHandler;添加备注
7871b4d7a 更新SDK,使用新的MessageHandler进行去重
97350ff60 升级 Senparc SDK;完善 MP GetResponseEntityMappingResult()
3b8377552 全面升级异步上下文消息,发布preview3 (ResponseMessage)尚未处理
e8c02f1aa 升级Senparc系列SDK
433ba51a9 全面升级 CO2NET 版本,升级 Senparc.Weixin.dll vv6.4.14
e4d3b5030 Update readme.md
ab94b04da Merge pull request #40 from JeffreySu/Developer
fa78058fd WxOpen v3.5.4 修正 UniformSendData 参数 #1901 @Dysheng
f79fb31db 更新版本号
e26032c2a 更新 .net 4.5 Sample 的 nuget 引用
80ee4bc8a Merge branch 'Developer' of https://github.com/JeffreySu/WeiXinMPSDK into Developer
4e143b788 更新 .net 4.5 项目版本号
948aa6130 WxOpen v3.5.3 引用最新版本 CO2NET 和 Senparc.Weixin
c683cc428 Merge pull request #39 from JeffreySu/Developer
06e1e3b98 合并 WxOpen 代码
75fd43ff8 Update README.md
bc78d5321 修正代码
532b57caa 添加注释
a8b835d26 全民升级版本,引用最新的 CO2NET
138e020f3 Sample v3.8.5 添加 EncryptHelper.DecodeUserInfoBySessionId() 异常调试日志记录
487947132 完善 AES_Decrypt,处理偶然出现的 adding is invalid and cannot be removed 问题(未发现规律);同时完善单元测试
99d32044b modify
1d3444a15 测试 EncryptHelper.DecodeEncryptedData() 方法
66fe7dfc1 创建单元测试 for #1869
ddd98b1b6 创建单元测试 for #1825
701a2cc02 更新版本号

git-subtree-dir: src/Senparc.Weixin.WxOpen
git-subtree-split: d8c85736cafc993a4b5a97de99fb91652c2b6522
JeffreySu pushed a commit that referenced this pull request Jun 9, 2020
JeffreySu pushed a commit that referenced this pull request Nov 6, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

8 participants