对于我的CS顶点项目,我们遇到一个类名称存在于两个不同依赖项中的问题。具体来说,我们使用一种依赖关系将MySQL与实体框架一起使用,而一种依赖关系仅用于连接和直接执行MySQL查询。
非EF由项目外部的组件拥有,并且此数据库是我们与数据库进行交互的主要方式之一。客户/导师已要求我们需要对一个单独的数据库(即EF正在连接的数据库)进行任何添加或更改。
我的问题本质上是关于如何解决错误the type <class-name> exists in both...
的问题,但是我更想知道.Net Core中名称空间污染的根本问题以及我们可以采取的措施。我调查了该错误,并在初始结果中描述了仅适用于.Net而不是.Net Core的修复程序,并说明了.Net Core不支持别名。
单独的项目-我问一个我认识的人,他对.Net有更多的经验,他建议创建单独的项目。尽管这显然可以消除构建错误,但我不知道我们如何在ASP.Net主应用程序中使用它。我假设要么都需要成为应用程序,要么都需要成为一个库。我还假设,如果它是一个单独的库,它将具有我们现在遇到的相同问题。
删除一个依赖项-我目前正在考虑不太理想的解决方案是重写依赖于EF的代码以使用直接MySQL连接依赖项。依靠该EF数据库的代码更少,因此重写该代码和一些SQL会更简单。
别名或完全引用-我发现的结果似乎仅适用于.Net,它使用别名描述或引用类型中的完整体式路径。根据我的阅读,.Net Core当前不支持此功能。如果是,我该怎么办?
using System;
using System.Collections.Generic;
using MySql.Data.MySqlClient;
namespace OVD.API.GuacamoleDatabaseConnectors
{
public class GuacamoleDatabaseConnector : IDisposable
{
private MySqlConnection connection;
...
该错误是MySqlConnection类型的,并且完全是:GuacamoleDatabaseConnectors/GuacamoleDatabaseConnector.cs(81,16): error CS0433: The type 'MySqlConnection' exists in both 'MySql.Data, Version=8.0.15.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d' and 'MySqlConnector, Version=0.49.2.0, Culture=neutral, PublicKeyToken=d33d3e53aa5f8c92' [/Users/markbeussink/Action/OVD/OVD.API/OVD.API.csproj]
这里是.cs.proj
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp2.2</TargetFramework>
<AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.App"/>
<PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All"/>
<PackageReference Include="Ldap.NETStandard" Version="1.0.3"/>
<PackageReference Include="MySql.Data" Version="8.0.15"/>
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="2.2.0"/>
</ItemGroup>
</Project>
答案 0 :(得分:2)
只需创建一个新项目“类库”,然后在该项目内,您就可以创建一个接口,使您可以从一个组件中访问一个方法(您需要在该项目内实现“组件”及其方法) 。像在立面模式中的东西。然后,在解决方案的其余部分中,您将仅使用新创建的项目参考。该解决方案允许您定义自己的名称空间名称
答案 1 :(得分:1)
由于您刚刚发现的原因,两个单独的项目具有相同名称空间和相同名称的类型是非常糟糕的形式。碰到这样的冲突完全不是正常现象,也不是您期望的那样,您很可能再也不会在职业生涯中再次遇到它。
看起来像这个项目:
https://www.nuget.org/packages/MySqlConnector/
决定破坏MySQL的更官方ADO.NET提供程序的名称空间:
https://www.nuget.org/packages/MySql.Data
通过定义名为MySql.Data.MySqlClient.MySqlConnection
的类型,而不是使用MySqlConnector.MySqlClient.MySqlConnection
等。
最好的方法是从您的项目中排除其中一个,而仅使用另一个。在这里,显而易见的选择是从
https://www.nuget.org/packages/Pomelo.EntityFrameworkCore.MySql/
到
https://www.nuget.org/packages/MySql.Data.EntityFrameworkCore/
但是我对这些库的相对优点没有任何看法。
如果您不能执行此操作,则C#为您提供一个compiler directive来别名一个具有不同名称空间的程序集。参见https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-messages/cs0433
这实际上将向有问题的程序集添加一个新的最外层名称空间级别,因此 other MySqlConnection将(仅在您的代码中)称为SomeAlias.MySql.Data.MySqlClient.MySqlConnection
。