【问题标题】:Is there a way of centralizing the access to a DataContext in C# using DI pattern?有没有办法使用 DI 模式集中访问 C# 中的 DataContext ?
【发布时间】: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


【解决方案1】:

您可以将通用存储库与依赖注入一起使用。这是第一次有点复杂的结构但是这可以解决您的问题。

我还与您分享一个很好的详细示例。那是我创造的

https://github.com/EyupCanARSLAN/N-Tier-Architecture-with-Generic-Repository--Dependency-Injection-And-Ninject/security/dependabot

还有一篇关于这个话题的文章

https://dotnettutorials.net/lesson/generic-repository-pattern-csharp-mvc/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-18
    • 2011-07-14
    • 2021-11-15
    • 2017-04-20
    • 2022-11-03
    • 2010-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多