Должен ли я определить методы как статические в библиотеке классов для использования в консольном приложении - PullRequest
0 голосов
/ 06 марта 2019

Сценарий : у меня есть консольное приложение, которое ссылается на пару библиотек классов. ClassLibEmployee извлекает данные из базы данных SQL и возвращает список. Мне нужно перебрать список сотрудников и отправить его в WebAPI и обновить статус БД SQL. Я создал ClassLibPay , который является оберткой для WebAPI.

ClassLibEmployee.EmployeeData ed = new ClassLibEmployee.EmployeeData();
var elist = ed.PullEmployees();

foreach (Employee e in elist) {

    bool stat = ClassLibPay.ServiceWrap.Sendtopay(e.Id, e.Name, e.Pay, e.ExemptFlag, e.Hours);

    ed.ChageStatus(e.Id, e.Name, e.Pay, e.ExemptFlag, e.Hours, stat);
}
  • В ClassLibEmployee я определил класс как public class EmployeeData
  • В ClassLibPay я определил класс как public static class ServiceWrap

Вопросы:

  1. , так как я буду вызывать метод ChangeStatus в EmployeeData для каждого сотрудника, должен ли это быть статический класс?

  2. ServiceWrap вызывает службу, есть ли способ избежать создания экземпляра службы для каждого вызова Sendtopay?


Консольное приложение - Ссылки ClassLibEmployee

public class EmployeeData
{
    public List<Employee> PullEmployees()
    {
    }
}

ConsoleApp --Ссылки ClassLibPay - ClassLibPay вызывает WebAPI

public static class ServiceWrap
{
    public static bool Sendtopay(int id, string name, decimal pay, bool flg, int hours)
    {
        using (EDataSvc service = new EDataSvc())
        {
            service.serviceMethod(id,name,pay,flg,hours);
        }
    }
}

1 Ответ

0 голосов
/ 06 марта 2019

Чтобы предотвратить создание каждого временного класса, вам определенно следует перейти к DI, как сказал Майкл.

Это очень простой пример того, как использовать DI с консольным приложением на основе библиотеки Autofac . Ниже у нас есть приложение главной консоли и два класса, один из которых является нашей оболочкой (где, возможно, вы хотите подготовить свои данные, и eDataService, который должен просто отправлять данные в бэкэнд. Мы регистрируем оба класса как PerLifeTimeScope (здесь это одноэлементный - в другие слова имеют только один экземпляр, если мы получаем его из контейнера DI.) Конечно, вы можете выбрать готовые платформы с уже интегрированными контейнерами DI.

class MainClass
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");

            var builder = new ContainerBuilder();

            builder.RegisterType<MyService>().As<IMyService>().InstancePerLifetimeScope();
            builder.RegisterType<EDataSvc>().InstancePerLifetimeScope();

            var container = builder.Build();

            using (var scope = container.BeginLifetimeScope())
            {
                var service = scope.Resolve<MyService>();
                service.MakeRequestAsync("test");
            }
        }
    }

    public class EDataSvc
    {
        public void SendRequestAsync()
        {
            //TODO:Send request
        }
    }

    public class MyService : IMyService
    {
        private EDataSvc _eDataService;

        public void MakeRequestAsync(EDataSvc eDataSvc)
        {
            _eDataService = eDataSvc;
        }

        public void MakeRequestAsync(string parameter)
        {
            //TODO prepare your data or additional logic

            _eDataService.SendRequestAsync();
        }
    }

    public interface IMyService
    {
        void MakeRequestAsync(string parameter);
    }
...