簡體   English   中英

我是否應該在類庫中將方法定義為靜態方法以在控制台應用程序中使用

[英]Should I define methods as static in class library to use in Console Application

場景 :我有一個控制台應用程序,它引用了幾個類庫。 ClassLibEmployee從SQL數據庫中提取數據並返回一個List。 我需要遍歷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);
        }
    }
}

為了避免創建每個時間類,您絕對應該像Michael所說的那樣使用DI方法。

這是一個非常簡單的示例,說明如何在基於Autofac庫的控制台應用程序中使用DI。 在下面,我們有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);
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM