Shared Project使用笔记

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shared Project使用笔记相关的知识,希望对你有一定的参考价值。

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视为不同的对象。

以上是关于Shared Project使用笔记的主要内容,如果未能解决你的问题,请参考以下文章

Laravel文档阅读笔记-How to deploy Laravel 8 project on Cpanel shared hosting

读书笔记

boost---shared_ptr笔记

智能指针std::shared_ptr初始化时可能泄露的地方

可以将右值移动到 shared_ptr 中吗

C++笔记-auto_ptr&unique_ptr&shared_ptr&shared_ptr基本用法