C# C语言中的类设计结构#
实体类:C# C语言中的类设计结构#,c#,asp.net,entity-framework,C#,Asp.net,Entity Framework,实体类: public class Customer { public int CustomerId { get; set; } public string Name { get; set; } } public class Invoice { public int InvoiceId { get; set; } public int CustomerId { get; set; } public string I
public class Customer {
public int CustomerId { get; set; }
public string Name { get; set; }
}
public class Invoice {
public int InvoiceId { get; set; }
public int CustomerId { get; set; }
public string InvoiceNo { get; set; }
}
接口:
public interface ICustomerService {
Customer GetCustomerById(int customerId);
void DeleteCustomer(int customerId);
}
public interface IInvoiceService {
Invoice GetInvoiceById(int invoiceId);
void DeleteInvoice(int invoiceId);
List<Invoice> GetAllInvoiceByCustomer(int customerId);
Customer GetInvoiceCustomer(int invoiceId);
}
因为当我为“CustomerService”创建新实例时,“CustomerService”将为“InvoiceService”创建新实例,“InvoiceServer”也将为“CustomerServer”创建新实例
1) 我应该将所有方法设置为静态吗?2) “InvoiceService”将从“CustomerService”调用方法,“CustomerService”也将从“InvoiceSercie”调用方法。我怎样写这些课程?如果我把所有的方法都设置为静态,问题就会解决,但我想这不是一个好的解决方案
多谢各位 您必须选择其中一个类来传递自身作为对另一个类的引用。假设是客户服务:
public class CustomerService : ICustomerService {
private readonly IInvoiceService _invoiceService = new InvoiceService(this);
...
}
public class InvoiceService : IInvoiceService {
private readonly ICustomerService _customerService;
public class InvoiceService(ICustomerService customerService) {
_customerService = customerService;
}
}
现在循环被打破了
另一种选择是使用依赖注入框架,如StructureMap或Ninject。一般来说,我建议减少类之间的耦合。每个类应该做一件事(Customer和Invoice),然后创建第三个类,该类使用这两种方法。例如,您可以创建一个名为“CustomerInvoicer”的类,该类接受其构造函数中的两个接口,并将方法“GetInvoiceCustomer”移动到该新类中。根据我的经验,从长远来看,这将使它更易于维护,因为每个类都有一个单独的职责,而最终用户只需要使用一个主类(可能有更高级的逻辑) 另外,我建议使用这种方法的依赖项注入库
An unhandled exception of type 'System.StackOverflowException' occurred
public class CustomerService : ICustomerService {
private readonly IInvoiceService _invoiceService = new InvoiceService(this);
...
}
public class InvoiceService : IInvoiceService {
private readonly ICustomerService _customerService;
public class InvoiceService(ICustomerService customerService) {
_customerService = customerService;
}
}
public class CustomerInvoicer {
private readonly ICustomerService _customerService;
private readonly IInvoiceService _invoiceService;
public CustomerInvoicer(ICustomerService cust, IInvoiceService inv) {
_invoiceService = inv;
_customerService = cust;
}
public Customer GetInvoiceCustomer(int invoiceId) {
Invoice invoice = _invoiceService.GetInvoiceById(invoiceId);
return _customerService.GetCustomerById(invoice.CustomerId);
}
}