我是否应该在类库中将方法定义为静态方法以在控制台应用程序中使用

时间:2019-03-06 01:43:16

标签: c# console-application

场景:我有一个控制台应用程序,它引用了几个类库。 ClassLibEmployee 从SQL数据库中提取数据并返回一个列表。我需要遍历Employee的列表,并将其发送到WebAPI并使用状态更新SQL DB。我创建了 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. 因为我将在EmployeeData中为每个雇员调用ChangeStatus方法,所以它应该是静态类吗?

  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 :(得分:0)

为避免创建每个课时,您绝对应该像迈克尔所说的那样转向DI模式。

这是一个非常简单的示例,说明如何将DI与基于Autofac库的控制台应用程序一起使用。在下面,我们有Main console应用程序和两个类,其中一个是我们的包装器(也许您想准备数据,而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);
    }