我有一个代码优先的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术语)?
答案 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)
。 您的选择。