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);
    }
}