【发布时间】:2021-02-02 01:50:58
【问题描述】:
这是我目前得到的,但必须不断传递 DataClassesDataContext。我想知道是否有更好的更集中的方式来使用 DataClassesDataContext 并在每次使用数据上下文时填充连接字符串......提前感谢所有帮助
public interface ICustomerDataAccess
{
string GetCustomerName(int customerId);
}
public class CustomerDataAccess : ICustomerDataAccess
{
private readonly DataClassesDataContext _context;
public CustomerDataAccess(DataClassesDataContext ctx)
{
_context = ctx;
}
public string GetCustomerName(int id)
{
return _context.Customers.Where(i => i.id == id).FirstOrDefault().name;
}
}
public class DataAccessFactory
{
public static ICustomerDataAccess GetCustomerDataAccessObj(DataClassesDataContext ctx)
{
return new CustomerDataAccess(ctx);
}
}
public class CustomerService
{
CustomerBusinessLogic _customerBL;
public CustomerService(DataClassesDataContext ctx)
{
_customerBL = new CustomerBusinessLogic(new CustomerDataAccess(ctx));
}
public string GetCustomerName(int id, DataClasses1DataContext ctx)
{
return _customerBL.GetCustomerName(id,ctx);
}
}
public class CustomerBusinessLogic
{
ICustomerDataAccess _custDataAccess;
public CustomerBusinessLogic(ICustomerDataAccess custDataAccess)
{
_custDataAccess = custDataAccess;
}
public CustomerBusinessLogic(DataClassesDataContext ctx)
{
_custDataAccess = new CustomerDataAccess(ctx);
}
public string GetCustomerName(int id, DataClassesDataContext ctx)
{
_custDataAccess = DataAccessFactory.GetCustomerDataAccessObj(ctx);
return _custDataAccess.GetCustomerName(id);
}
}
//并在界面上使用这样的代码
private void button5_Click(object sender, EventArgs e)
{
using (var ctx = new DataClassesDataContext)
{
CustomerService customerSrv = new CustomerService(ctx);
textBox1.Text = customerSrv.GetCustomerName(1, ctx);
}
}
【问题讨论】:
-
您似乎在滥用您的
button5_Click方法作为Composition Root。与其在该方法中组成您的对象图,并且可能通过您表示层中的许多方法复制它,不如尝试通过将依赖项注入您的表示类中,将其从表示类中移出到一个集中的位置。在您的示例中,这意味着将CustomerService注入到包含button5_Click的类的构造函数中。 -
谢谢史蒂文,这就是我的怀疑。所以我包括了这个属性: private CustomerService _custService;并在 Form 构造函数中请求它 public Form1(CustomerService _custService) { this._custService = _custService;初始化组件(); } 在 winforms 的 main 函数中添加了这样的内容: Main() { DataContext db = new DataContext(); db.Connection.ConnectionString = "数据源=*****"; Application.Run(new Form1(new CustomerService(db))); } 这样就够了吗?
-
现在 GUI 事件看起来更干净了,但不确定该模式是否实现得很好。 private void button5_Click(object sender, EventArgs e) { textBox1.Text = this._custService.GetCustomerName(1); }
标签: c# dependency-injection inversion-of-control datacontext dependency-inversion