1.概要
本文主要分享如何Shared Project使用,和避坑。
1.1什么是Shared Project?
说简单一点就是微软提供的一个代码共享项目模板,从 Visual Studio 2015 起,共享项目 (Shared Project) 作为新的一种项目类型被添加到项目模板列表中,它带来的好处主要是使多个不同类型、不同平台的项目之间可以共享代码或资源这样我们就不用去重复写代码,或者在特殊情况下就不用将一个类直接拷贝到另外一个类库下。
1.2如何使用?
1.2.1创建项目
找到项目模板
1.2.2使用
创建完成之后,库的图标和常规的C#库不一样是两个菱形。
接着创建一个类,代码如下:
public class Class1
{
public int Calculation(int i,int j)
{
return i + j;
}
}
然后在需要share的项目上添加引用,接着正常通过类名正常访问该方法即可
2.详细内容
2.1解读
Shared Project当然还有其他的使用场景这里就介绍基本用,看完以上操作之后大家可能会认为创建一个普通的类库好像也能实现,实际上也差不多。
普通类库的有一个弊端就是在大家误操作的时候会出现类库与类库之间项目引用变成了“循环引用”,而Shared Project只能被别人引用。
将不受平台、框架限制的通用代码可以放到Shared Project。
可能更多的会在设计上考虑在Shared Project中放些通用的代码,以Prism举例:
Prism的设计是将xxx.Container(容器)放到了Shared Project中,这样在兼容Wpf和Forms上就不用重复写Container相关的代码了,举一反三那么如果要兼容MAUI和Avalonia实现同样的框架设计那么拿来直接用即可。
2.2使用注意
最近在研究用DDD写服务端,出现一个场景。当拆分多个服务的时候每个细分服务都会使用HttpResponseDTO,那么这个时候我不想使用类库造成“引用混乱”自然是想到使用Shared Project。
结果我在使用的时候出现了一个问题,在写web api层的时候会用HttpResponseDTO,在Application层也会用到我同时在这两层同时引用了Shared Project里的HttpResponseDTO这个时候就出现了一个冲突这个问题查了一早上。项目结构如下:
代码:
[HttpPost]
public async Task<HttpResponseDTO<bool>> Upload(UplaodVersionDTO version, HttpRequest request)
{
try
{
//.....
//这句代码报错,从Application层引用的实现逻辑。
return await _upgradeService.Upload(version, file.Item1, file.Item2);
}
catch (Exception ex)
{
_logger.LogError(ex, ex.Message);
return HttpResponseDTO<bool>.InnerException(false, ex.Message);
}
}
错误:
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 CS0029 无法将类型“xxx.Domain.Shared.DataTransferObjects.HttpResponse<bool> [AService.Application, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]”
隐式转换为“xxx.Domain.Shared.DataTransferObjects.HttpResponse<bool> [AService.Api, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]”
AService.Api
怎么样想都没有想明白为什么会出现这种问题,当我把web api层的Shared Project引用移除之后就正常了。原来VS会将不同层的引用的Shared Project视为不同的对象。