C# 重构方法,asp.net mvc4
我有两种可能相同的方法,如下所示:C# 重构方法,asp.net mvc4,c#,asp.net,asp.net-mvc,C#,Asp.net,Asp.net Mvc,我有两种可能相同的方法,如下所示: [HttpGet] public ActionResult CreateDirectory(string designId, CreateDirectoryModel model) { string customerSchema = SfsHelpers.StateHelper.GetSchema(); TemplateLibraryEntry entry = GetTemplateLibraryEntry(model.DesignId, c
[HttpGet]
public ActionResult CreateDirectory(string designId, CreateDirectoryModel model)
{
string customerSchema = SfsHelpers.StateHelper.GetSchema();
TemplateLibraryEntry entry = GetTemplateLibraryEntry(model.DesignId, customerSchema);
var path = Path.Combine(Server.MapPath("~/"), entry.FilePath);
model.DesignId = designId;
model.Directories = new List<string>();
model.Directories.Add("/");
model.Directories.AddRange(Directory.GetDirectories(path, "*", SearchOption.AllDirectories));
for (int i = 1; i < model.Directories.Count; i++) {
model.Directories[i] = model.Directories[i].Substring(path.Length).Replace('\\', '/');
}
model.Directories.Sort();
return View(model);
}
public void GetUploadFileFolders(IMyModel model, string designId)
{
// ...
}
您可以在UploadViewModel中创建一个属性,因为我在这两者中看到的所有属性都是相同的:
public class UploadViewModel
{
CreateDirectoryModel createModel {get;set;}
}
public void GetUploadFileFolders(CreateDirectoryModel model, string designId)
{
string customerSchema = SfsHelpers.StateHelper.GetSchema();
TemplateLibraryEntry entry = GetTemplateLibraryEntry(designId, customerSchema);
var path = Path.Combine(Server.MapPath("~/"), entry.FilePath);
model.DesignId = designId;
model.Directories = new List<string>();
model.Directories.Add("/");
model.Directories.AddRange(Directory.GetDirectories(path, "*", SearchOption.AllDirectories));
for (int i = 1; i < model.Directories.Count; i++)
{
model.Directories[i] = model.Directories[i].Substring(path.Length).Replace('\\', '/');
}
model.Directories.Sort();
}
在将其用于上载ViewModel时,您现在可以执行以下操作:
GetUploadFileFolders(model.creatModel,designId);
您可以使用接口(或基类)来定义两个类所需的部件:
public interface IMyModel
{
string DesignId { get; set; }
List<string> Directories { get; set; }
}
在第二种方法中,将参数类型更改为IMyModel
,如下所示:
[HttpGet]
public ActionResult CreateDirectory(string designId, CreateDirectoryModel model)
{
string customerSchema = SfsHelpers.StateHelper.GetSchema();
TemplateLibraryEntry entry = GetTemplateLibraryEntry(model.DesignId, customerSchema);
var path = Path.Combine(Server.MapPath("~/"), entry.FilePath);
model.DesignId = designId;
model.Directories = new List<string>();
model.Directories.Add("/");
model.Directories.AddRange(Directory.GetDirectories(path, "*", SearchOption.AllDirectories));
for (int i = 1; i < model.Directories.Count; i++) {
model.Directories[i] = model.Directories[i].Substring(path.Length).Replace('\\', '/');
}
model.Directories.Sort();
return View(model);
}
public void GetUploadFileFolders(IMyModel model, string designId)
{
// ...
}
然后可以从第一个方法调用第二个方法
[HttpGet]
public ActionResult CreateDirectory(string designId, CreateDirectoryModel model)
{
GetUploadFileFolders(model, designId);
return View(model);
}
使用基于约定的映射器Automapper,您可以将它们组合为
[HttpGet]
public ActionResult CreateDirectory(string designId, CreateDirectoryModel model)
{
string customerSchema = SfsHelpers.StateHelper.GetSchema();
TemplateLibraryEntry entry = GetTemplateLibraryEntry(model.DesignId, customerSchema);
var path = Path.Combine(Server.MapPath("~/"), entry.FilePath);
model.DesignId = designId;
model.Directories = new List<string>();
model.Directories.Add("/");
model.Directories.AddRange(Directory.GetDirectories(path, "*", SearchOption.AllDirectories));
for (int i = 1; i < model.Directories.Count; i++) {
model.Directories[i] = model.Directories[i].Substring(path.Length).Replace('\\', '/');
}
model.Directories.Sort();
//
Mapper.CreateMap<CreateDirectoryModel,UploadViewModel>();
var uploadmodel=Mapper.Map<UploadViewModel>(model);
uploadmodel.Directories.Sort();
//
return View(model);
}
[HttpGet]
public ActionResult CreateDirectory(字符串设计ID,CreateDirectoryModel模型)
{
字符串customerSchema=sfshellers.StateHelper.GetSchema();
TemplateLibraryEntry=GetTemplateLibraryEntry(model.DesignId,customerSchema);
var path=path.Combine(Server.MapPath(“~/”),entry.FilePath);
model.DesignId=设计ID;
model.Directories=新列表();
model.Directories.Add(“/”);
model.Directories.AddRange(Directory.GetDirectories(path,“*”,SearchOption.AllDirectories));
对于(int i=1;i
但是,我建议您,如果这两个类不是专门化的,请使用其中一个类,从而减少冗余函数是可重用的,您可以创建函数并从这两个操作调用相同的函数。或者您可以从上面的操作调用GetUploadFileFolders方法。是的,有可能…您在这一步中的哪一步停止了?取决于模型类之间的相互关系。谢谢。但如果您看到,它们使用两种不同的模型:CreateDirectoryModel和UploadViewModel。所以我不能同时使用它们中的一个。您可能希望创建一个两个类都实现的接口。然后你可以把它传给别人,但如果你这样做的话,就像我在这里贴的那样。那么目录就找不到了。谢谢。这是多种方法的结合
[HttpGet]
public ActionResult CreateDirectory(string designId, CreateDirectoryModel model)
{
GetUploadFileFolders(model, designId);
return View(model);
}
[HttpGet]
public ActionResult CreateDirectory(string designId, CreateDirectoryModel model)
{
string customerSchema = SfsHelpers.StateHelper.GetSchema();
TemplateLibraryEntry entry = GetTemplateLibraryEntry(model.DesignId, customerSchema);
var path = Path.Combine(Server.MapPath("~/"), entry.FilePath);
model.DesignId = designId;
model.Directories = new List<string>();
model.Directories.Add("/");
model.Directories.AddRange(Directory.GetDirectories(path, "*", SearchOption.AllDirectories));
for (int i = 1; i < model.Directories.Count; i++) {
model.Directories[i] = model.Directories[i].Substring(path.Length).Replace('\\', '/');
}
model.Directories.Sort();
//
Mapper.CreateMap<CreateDirectoryModel,UploadViewModel>();
var uploadmodel=Mapper.Map<UploadViewModel>(model);
uploadmodel.Directories.Sort();
//
return View(model);
}