场景:我有一个控制台应用程序,它引用了几个类库。 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);
}
public class EmployeeData
public static class ServiceWrap
问题:
因为我将在EmployeeData中为每个雇员调用ChangeStatus方法,所以它应该是静态类吗?
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);
}
}
}
答案 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);
}