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);
    }