mvc pass Модельный объект как переменная для избыточной функции - PullRequest
0 голосов
/ 28 декабря 2018

Иметь проект Entity Framework MVC5.Иметь проект MVC и пытаться уменьшить мои функции, и есть несколько, которые в основном одинаковы.Функции обновляют те же 3 поля: оператор, дата и функция, выполняемая на столе.Каждая функция ссылается на разные имена таблиц и полей.Есть ли способ передать таблицу модели и имена полей в функцию, чтобы у меня не было одного для каждой таблицы в модели?

Это мои функции:

  internal void TrackAggrTest(mts_aggrtest mts_aggrtest, string struser, string action)
    {
        // Tract User Action AggrSpec 
        mts_aggrtest.F_OPRID = struser.ToString().Substring(struser.LastIndexOf("\\") + 1).ToUpper();
        mts_aggrtest.F_DATENT = DateTime.Today;
        mts_aggrtest.F_FUNCT = action.ToString();

        return;
    }



    internal void TrackBoltTest(mts_bolttest mts_bolttest, string struser, string action)
    {
        // Tract User Action mts_meshtest 
        mts_bolttest.T_OPRID = struser.ToString().Substring(struser.LastIndexOf("\\") + 1).ToUpper();
        mts_bolttest.T_DATENT = DateTime.Today;
        mts_bolttest.T_FUNCT = action.ToString();

        return;
     }


    internal void TrackBoltSpec(mts_boltspec mts_boltspec, string struser, string action)
    {
        // Tract User Action mts_meshtest 
        mts_boltspec.TS_OPRID = struser.ToString().Substring(struser.LastIndexOf("\\") + 1).ToUpper();
        mts_boltspec.TS_DATENT = DateTime.Today;
        mts_boltspec.TS_FUNCT = action.ToString();

        return;
    }

Эти функции вызываются в контроллерах в Edit / Create Actions.

В MTS_aggrspecController в действии Create у меня есть:

     var struser = (Session["myUser"]).ToString();
     b.TrackAggrSpec(mts_aggrspec, struser, "A");

В действии EDIT:

     var struser = (Session["myUser"]).ToString(); 
     b.TrackAggrSpec(mts_aggrspec, struser, "U");

В MTS_aggrtestController функция вызывается:

     var struser = (Session["myUser"]).ToString(); 
     b.TrackAggrTest(mts_aggrtest, struser, "U");

Это просто кажется излишним и знаю, что ДОЛЖЕН быть лучший способ, я просто не знаю как.

Посмотрел другой пост, но не может найти тот, который подходит для этой проблемы.Любая помощь приветствуется или может указать мне правильное направление.

1 Ответ

0 голосов
/ 03 января 2019

Прежде всего, вам не нужно вызывать ToString() для строк.

    mts_boltspec.TS_OPRID = struser
      .ToString()
      .Substring(struser.LastIndexOf("\\") + 1)
      .ToUpper();
    mts_boltspec.TS_FUNCT = Action.ToString();

Должно быть просто

    mts_boltspec.TS_OPRID = struser
      .Substring(struser.LastIndexOf("\\") + 1)
      .ToUpper();
    mts_boltspec.TS_FUNCT = Action;

Во-вторых, рекомендации Microsoft предлагают строчные параметры

internal void TrackAggrTest(mts_aggrtest mts_aggrtest, string struser, string Action)

должно быть

internal void TrackAggrTest(mts_aggrtest mts_aggrtest, string struser, string action)

Наконец,вам не нужно пустое выражение возврата.

internal void TrackAggrTest(mts_aggrtest mts_aggrtest, string struser, string action)
{
    mts_boltspec.TS_OPRID = struser
      .Substring(struser.LastIndexOf("\\") + 1)
      .ToUpper();
    mts_boltspec.TS_DATENT = DateTime.Today;
    mts_boltspec.TS_FUNCT;
}

С базовыми возможностями вы можете объединить все эти методы в один, используя generics и Action (делегат) .Чтобы сделать читабельным, я бы также создал метод расширения.

internal static class TrackAggrTestExtensions
{
  public static void TrackAggrTest<TBoltSpec>(this TBoltSpec instance,
    string struser,
    string funct,
    Action<TBoltSpec, string> assignOprId,
    Action<TBoltSpec, DateTime> assignDateNT,
    Action<TBoltSpec, string> assignFunct) 
  {
    var oprid = struser
      .Substring(struser.LastIndexOf("\\") + 1)
      .ToUpper();
    var datent = DateTime.Today;

    assignOprId(instance, oprid);
    assignDateNT(instance, datent);
    assignFunct(instance, funct);
  }
}

Теперь ваши звонки выглядят так:

myAggrTest.TrackAggrTest(struser, 
  action, 
  (i, id) => i.F_OPRID = id,
  (i, dt) => i.F_DATENT = dt,
  (i, f) => i.F_FUNCT = f);

myBoltTest.TrackAggrTest(struser, 
  action, 
  (i, id) => i.T_OPRID = id,
  (i, dt) => i.T_DATENT = dt,
  (i, f) => i.T_FUNCT = f);

myBoltSpec.TrackAggrTest(struser, 
  action, 
  (i, id) => i.TS_OPRID = id,
  (i, dt) => i.TS_DATENT = dt,
  (i, f) => i.TS_FUNCT = f);

Не совсем уверен, что это хоть немного лучше.

...