gpt4 book ai didi

c# - 使用接口(interface)将数据传递到数据层是否可以接受

转载 作者:行者123 更新时间:2023-11-30 14:11:23 24 4
gpt4 key购买 nike

所以。这可能是一个愚蠢的问题,但是......

我仅限于使用不支持 EntityFramework 的数据库,但我仍然想将我的数据层分离到一个单独的程序集中。这意味着我需要共享域对象值,同时避免在我的业务层和数据层之间进行循环引用。因此,我想知道构建一个持久化接口(interface)的存储库是否可以接受,这些存储库可以由业务层实现并相互独立地传递给数据层。

示例如下:

// Business Layer
public class Customer: IPersistableCustomer
{
private string name;

public string Name{ get { return this.name; } }

public void persist()
{
dataLayer.StoreCustomerInstance(this);
}
}

// DataLayer
public StoreCustomerInstance(IPersistableCustomer persistableCustomer)
{
// Do storage stuff
}

// Interface repository
public interface IPersistableCustomer
{
string Name { get; }
}

我几乎可以肯定这是个糟糕的主意,但我不确定为什么。我很想知道人们的想法,看看哪里可能存在任何潜在的陷阱。

最佳答案

您在示例中所做的是将您的域对象隐藏在界面后面。您应该做的是将您的数据层隐藏在接口(interface)后面。这种数据层的抽象通常称为存储库模式

在业务层中,您定义域类和存储库接口(interface):

public class Customer
{
public Customer(string name)
{
this.Name = name;
}

public string Name { get; private set; }
}

public interface ICustomerRepository
{
void Save(Customer customer);
}

请注意,Customer 类没有任何持久性逻辑。存储库界面也没有;它只定义了数据层的契约

合约的实现进入数据层:

public class SqlCustomerRepository : ICustomerRepository
{
public void Save(Customer customer)
{
// Persistence logic
}
}

此时数据层需要引用业务层,反之则不然。

您在应用层将这两层联系在一起:

class CustomerForm
{
private readonly ICustomerRepository customerRepository;

// This class declares a dependency on any ICustomerRepository
public CustomerForm(ICustomerRepository customerRepository)
{
this.customerRepository = customerRepository;
}

public void PersistCustomer()
{
Customer customer = CreateCustomerFromUserInput();

this.customerRepository.Save(customer);
}
}

class Program
{
static void Main(string[] args)
{
// Dependency injection, usually done via a DI container
var customerRepository = new SqlCustomerRepository();
var form = new CustomerForm(customerRepository);

form.PersistCustomer();
}
}

我在 Onion Architecture 上找到了文章当面临与您相同的问题时非常有值(value)。它解释了如何以防止与数据层紧密耦合的方式设置应用程序的架构。

为数据层使用接口(interface)的另一个优点是,它允许您对大部分代码进行单元测试,而无需运行实际的数据库。您可以简单地模拟存储库接口(interface)。

几年前,我曾经为我的领域对象使用过接口(interface)。我不后悔,因为它教会了我如何去做。但这是唯一的好处;这是很多额外的工作和维护,没有任何实际好处:)

关于c# - 使用接口(interface)将数据传递到数据层是否可以接受,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20249864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com