如何从 DLL 中的组件公开 Class 类型
How to Expose Class Types from a Component within a DLL
我正在使用一家名为 Devart 的公司的组件。该组件生成的数据模型与 Entity Framework 非常相似,只是它用于 SQLite。我的数据模型和数据上下文等与 Entity Framework 的工作方式非常相似。
我创建了一个 Windows .NetFramework DLL Class 库,我将使用它来处理许多与数据库相关的活动。在这个 DLL 中,我有我的数据模型和数据上下文,它们当然包含我所有的 table class 类型等
在我的 DLL 中,我可以编写以下代码:
public dbSales.tbl_Customers GetCustomer_byCustomerID(int _customerID)
{
dbSales.tbl_Customers selectedCustomer = (from dbContext.tbl_Customers
where i.CustID == _customerID
Select i).FirstOrDefault();
}
然后在我的其他程序中我想引用 DLL 和该方法来检索数据。我不知道如何公开我的 table 的类型,以便我可以执行以下操作:我的 DLL 包含一个名为 DataHelper 的 class。
(为清楚起见,代码以扩展形式编写)
DataHandler.DataHelper.tbl_Customers selectedCustomer = new DataHandler.DataHelper.tbl_Customers();
selectedCustomer = DataHandler.DataHelper.GetCustomer_byCustomerID(45);
我不知道如何公开类型:tbl_Customers。这只是我的无知。我发现的唯一解决方法是使用 var 执行以下操作。我喜欢能够指定我的类型,但不喜欢使用 var。以下作品:
var selectedCustomer = DataHandler.DataHelper.GetCustomer_byCustomerID(45);
我已经尝试制作不同的东西 public,例如模型或上下文等。但我仍然好像只公开方法和属性。我对类型以及如何使用它们一无所知。老实说,我想找到一本解释类型以及如何使用它们的好书。
如果有人可以提供帮助,将不胜感激。
简单的解决方案是您可以像这样将类型标记为 public:
public class MyClass{
}
默认情况下类型是内部类型,因此只能从同一项目中访问它们。
比创建数据库实体类型 public 更好的解决方案是创建一个 class 域对象库。它们将是包含属性但不包含业务逻辑的类型,并且它们的属性将与您希望从数据访问项目中的相应类型公开的属性相同。然后,您可以使用像 automapper 这样的工具从数据访问层 return 这些类型。这有助于封装您的数据访问层。
https://github.com/AutoMapper/AutoMapper
例如,如果您的数据访问层具有这样的Customer
类型
internal class Customer
{
public int CustomerID { get; set; }
public string Name { get; set; }
}
您的域层可以有一个名为 Customer
的 public class,具有相同的属性。然后你可以像这样实现你的存储库:
using Domain = MyDomainProject;
public interface ICustomerRepository
{
Task<Domain.Customer> GetCustomerByIDAsync(int customerID);
}
internal class CustomerRepository : ICustomerRepository
{
private readonly DbContext context;
private readonly IMapper mapper;
public CustomerRepository (DbContext context, IMapper mapper)
{
this.context = context;
this.mapper = mapper;
}
public async Task<Domain.Customer> GetCustomerByIDAsync(int customerID)
{
var customer = await context.Customer.FirstAsync(c => c.CustomerID == customerID);
return mapper.Map<Domain.Customer>(customer);
}
}
我正在使用一家名为 Devart 的公司的组件。该组件生成的数据模型与 Entity Framework 非常相似,只是它用于 SQLite。我的数据模型和数据上下文等与 Entity Framework 的工作方式非常相似。
我创建了一个 Windows .NetFramework DLL Class 库,我将使用它来处理许多与数据库相关的活动。在这个 DLL 中,我有我的数据模型和数据上下文,它们当然包含我所有的 table class 类型等
在我的 DLL 中,我可以编写以下代码:
public dbSales.tbl_Customers GetCustomer_byCustomerID(int _customerID)
{
dbSales.tbl_Customers selectedCustomer = (from dbContext.tbl_Customers
where i.CustID == _customerID
Select i).FirstOrDefault();
}
然后在我的其他程序中我想引用 DLL 和该方法来检索数据。我不知道如何公开我的 table 的类型,以便我可以执行以下操作:我的 DLL 包含一个名为 DataHelper 的 class。
(为清楚起见,代码以扩展形式编写)
DataHandler.DataHelper.tbl_Customers selectedCustomer = new DataHandler.DataHelper.tbl_Customers();
selectedCustomer = DataHandler.DataHelper.GetCustomer_byCustomerID(45);
我不知道如何公开类型:tbl_Customers。这只是我的无知。我发现的唯一解决方法是使用 var 执行以下操作。我喜欢能够指定我的类型,但不喜欢使用 var。以下作品:
var selectedCustomer = DataHandler.DataHelper.GetCustomer_byCustomerID(45);
我已经尝试制作不同的东西 public,例如模型或上下文等。但我仍然好像只公开方法和属性。我对类型以及如何使用它们一无所知。老实说,我想找到一本解释类型以及如何使用它们的好书。
如果有人可以提供帮助,将不胜感激。
简单的解决方案是您可以像这样将类型标记为 public:
public class MyClass{
}
默认情况下类型是内部类型,因此只能从同一项目中访问它们。
比创建数据库实体类型 public 更好的解决方案是创建一个 class 域对象库。它们将是包含属性但不包含业务逻辑的类型,并且它们的属性将与您希望从数据访问项目中的相应类型公开的属性相同。然后,您可以使用像 automapper 这样的工具从数据访问层 return 这些类型。这有助于封装您的数据访问层。
https://github.com/AutoMapper/AutoMapper
例如,如果您的数据访问层具有这样的Customer
类型
internal class Customer
{
public int CustomerID { get; set; }
public string Name { get; set; }
}
您的域层可以有一个名为 Customer
的 public class,具有相同的属性。然后你可以像这样实现你的存储库:
using Domain = MyDomainProject;
public interface ICustomerRepository
{
Task<Domain.Customer> GetCustomerByIDAsync(int customerID);
}
internal class CustomerRepository : ICustomerRepository
{
private readonly DbContext context;
private readonly IMapper mapper;
public CustomerRepository (DbContext context, IMapper mapper)
{
this.context = context;
this.mapper = mapper;
}
public async Task<Domain.Customer> GetCustomerByIDAsync(int customerID)
{
var customer = await context.Customer.FirstAsync(c => c.CustomerID == customerID);
return mapper.Map<Domain.Customer>(customer);
}
}