将C#3层体系结构插入到数据库中,同时考虑依赖项注入

将C#3层体系结构插入到数据库中,同时考虑依赖项注入,c#,.net,design-patterns,dependency-injection,C#,.net,Design Patterns,Dependency Injection,假设我有一个交易表单,我可以在其中选择一个特定的客户和该客户的订单详细信息 因此,我将: Customer.cs public class Customer { public string Id { get; set} public string Name { get; set} } public class Goods { public string Id { get; set} public string Description { get; set}

假设我有一个交易表单,我可以在其中选择一个特定的客户和该客户的订单详细信息

因此,我将:

Customer.cs

public class Customer
{
    public string Id { get; set}
    public string Name { get; set}
}
public class Goods
{
    public string Id { get; set}
    public string Description { get; set}
    public string Price { get; set}
}
public class Order
{
    private List<Goods> _orderedGoods = new List<Goods>();

    public string Id { get; set}
    public Customer Customer { get; set}
    public List<Goods> OrderedGoods { get; }

    public void AddGoods(Goods goods)
    {
        _orderedGoods.Add(goods);
    }
}
Goods.cs

public class Customer
{
    public string Id { get; set}
    public string Name { get; set}
}
public class Goods
{
    public string Id { get; set}
    public string Description { get; set}
    public string Price { get; set}
}
public class Order
{
    private List<Goods> _orderedGoods = new List<Goods>();

    public string Id { get; set}
    public Customer Customer { get; set}
    public List<Goods> OrderedGoods { get; }

    public void AddGoods(Goods goods)
    {
        _orderedGoods.Add(goods);
    }
}
订单.cs

public class Customer
{
    public string Id { get; set}
    public string Name { get; set}
}
public class Goods
{
    public string Id { get; set}
    public string Description { get; set}
    public string Price { get; set}
}
public class Order
{
    private List<Goods> _orderedGoods = new List<Goods>();

    public string Id { get; set}
    public Customer Customer { get; set}
    public List<Goods> OrderedGoods { get; }

    public void AddGoods(Goods goods)
    {
        _orderedGoods.Add(goods);
    }
}
公共类秩序
{
私有列表_orderedGoods=新列表();
公共字符串Id{get;set}
公共客户客户{get;set}
公共列表OrderedGoods{get;}
公共物品(货物)
{
_订单货物。添加(货物);
}
}
然后在表示层,我有一个gridview,它只包含商品id字符串

我的问题是:

  • 让Order类创建自己的细节可以吗?还是也应该注入财产

  • 当我想保存我的订单时,应该是填充订单详细信息的演示层还是业务层

  • 若业务层只发送一个完整的对象供存储库保存,那个么业务层应该能够创建一个新的订单对象吗?或者有没有另一种方法可以在考虑DI的情况下管理瞬态对象创建

  • 很抱歉问了这么长的问题,我真的需要帮助


    谢谢大家!

    这很主观,但对我来说:

    让Order类创建自己的细节可以吗?还是应该 还有财产注入吗

    你说的创造自己的细节是什么意思?一个新的细节对象应该有一个输入(从UI)或者应该从存储库(存储库)中检索。这样,我更喜欢保留要注入的细节,而不是在Order类中创建;并在UI或存储库中创建,或在负责创建的业务类中创建

    当我想保存我的订单时,应该是演示层还是 填充订单详细信息的业务层

    这取决于订单明细对象的创建是否有特定的规则。如果没有,那么我更喜欢创建带有细节的Order类,并让业务层进行验证。如果它需要特定的逻辑(例如将值a设置为属性a,将值1设置为属性B),请将其保留在业务逻辑中,或者为其创建构建器模式

    如果业务层只发送一个完整的对象供存储库保存, 那么业务层应该能够创建一个新的订单对象吗?或者是 有没有另一种方法可以在考虑DI的情况下管理瞬态对象创建

    这和我上面的回答是一样的。依赖注入的主要目的是以这样一种模块化的方式保持逻辑,以便它能够被重用和标准化。如果您认为在对象创建(细节)中需要一个特定的可重用逻辑,那么您需要为它创建一个服务对象。否则,最好将创建留在其他层(UI)中

    其他需要注意的事项:

    确实要使用
    列表
    作为详细数据类型吗?它将细节对象的实现限制为仅
    列表
    。如果有时逻辑想要使用
    数组
    ,则需要对对象进行另一个配置。我更喜欢使用
    IEnumerable
    ,如果需要在运行时插入,则可以私下使用
    List

    编辑:

    用户似乎想知道如何处理对象创建。我将从最简单到最安全地解释它

    最简单-->UI级别,假设使用C#winform:

    最安全的(IMHO):


    所以基本上我应该使用
    private IEnumerable\u orderedGoods并通过属性注入设置其值?你能给我指个地方吗?我仍然不知道如何在gridview中将用户的输入转换成passable对象,而不使用
    new object()
    东西来实例化它。我的意思是使用
    private List\u orderedGoods并具有
    公共IEnumerable OrderedGoods
    。然后创建一个空心以插入详图。当你想使你的对象不可变时,有时这会很有用。您使用的是什么用户界面?通常我只是接受本地数据类型(字符串等)的输入,然后做一些基本的验证并创建对象。是的,这正是我想知道的。如何从本机创建对象?您是否将本机从表示层传递到业务层进行基本验证,然后让业务层生成对象?