Asp.net - 向课堂添加功能

时间:2015-12-19 02:15:57

标签: c# asp.net oop

我有一个代码优先的Entity Framework类,如下所示:

public class Image
{
    public int ImageID { get; set; }
    public string DataType { get; set; }
    public int Size { get; set; }
    public byte[] Content { get; set; }
}

我在接收IFormFile的控制器中编写了几行代码,然后提取文件数据并将其读入Image:

var content = formFile.OpenReadStream();
byte[] buf = new byte[content.Length];
content.Read(buf, 0, buf.Length);
var newImg = new Image();
newImg.Content = buf;
newImg.DataType = formFile.ContentType;

由于在上传图像的任何地方重复使用此代码,我想以某种方式将其封装为“SaveUpload”'功能。它将用于解决方案中的各种控制器。

将此作为{set;}仅非映射属性添加到Image类/表的最佳方法是什么?

或者以某种方式封装或继承此属性(对不起,我还在学习OOP术语)?

3 个答案:

答案 0 :(得分:2)

您可能需要考虑创建一个UploadService类来封装此逻辑。无论是控制器还是Image类都不应该真正了解这些细节,通过将其抽象为服务,您可能会发现代码更易读,更易于维护。

UploadService:

public class UploadService
{
    public void SaveUpload(IFormFile formFile)
    {
        var content = formFile.OpenReadStream();
        byte[] buf = new byte[content.Length];
        content.Read(buf, 0, buf.Length);
        var newImg = new Image();
        newImg.Content = buf;
        newImg.DataType = formFile.ContentType;

        //insert newImg...
    }
}

我甚至会考虑使用像Unity或Ninject这样的依赖注入框架将此服务注入您的控制器中,这样可以让您将服务隔离开来进行单元测试。

答案 1 :(得分:0)

在课堂上做下一步:

public static void YourMethod(/*parameters, if you need them*/){
    var content = formFile.OpenReadStream();
    byte[] buf = new byte[content.Length];
    content.Read(buf, 0, buf.Length);
    var newImg = new Image();
    newImg.Content = buf;
    newImg.DataType = formFile.ContentType;
}

答案 2 :(得分:0)

可以添加正常的静态函数,但是为了实用起见:POCO类不应该有任何逻辑期望字段。更好的方法是创建其他类,f.e:UploadService哪个方法:Save(Image image)您的选择。