Abp Wcf结合使用问题

本文分享了使用ABP框架搭建WCF服务的经验,包括解决常见错误如找不到支持组件及服务注入问题,并提供了解决方案及代码示例。

在学习了几天的Abp后,大概是对Abp有了一个印象较为简单的记忆。由于以前接触过DDD相关内容,故学习起来比较顺利。

然而在搭建Wcf服务时候还是出现个各种Bug...

1.No component for supporting the service Abp.Web.Localization.ICurrentCultureSetter was found...

这个问题在AbpGithub上也有人提。解决方案也简单。就是在WcfModule里添加对Apb模块AbpWebApiModule的注入。

Github链接https://github.com/aspnetboilerplate/aspnetboilerplate/issues/2463

2.在服务.svc文件中无法将Application接口注入。

  •   Kernel was null, did you forgot to call DefaultServiceHostFactory.RegisterContainer() ?参数名: kernel
    在Global文件加入代码
            protected override void Application_Start(object sender, EventArgs e)
            {  AbpBootstrapper.IocManager.IocContainer.AddFacility<WcfFacility>()
                    .Register(
                        Component.For<ErrorHandlerBehavior>().Attribute("scope").Eq(WcfExtensionScope.Services)
                    );
    
                base.Application_Start(sender, e);
            }
  • 提供的服务类型无法加载为服务,因为它没有默认(缺少参数)构造函数。要解决此问题,请将默认构造函数添加到类型或将类型的实例传递到主机。
    在你建立的.svc服务文件中添加Factory="Castle.Facilities.WcfIntegration.DefaultServiceHostFactory,Castle.Facilities.WcfIntegration"这个是Abp自带的Castle注入工厂。

     同时在WcfModule中进行Wcf服务注入。示例

 1 using Abp.Modules;
 2 using Abp.WebApi;
 3 using Castle.Facilities.WcfIntegration;
 4 using Castle.MicroKernel.Registration;
 5 using System;
 6 using System.Collections.Generic;
 7 using System.Linq;
 8 using System.Reflection;
 9 using System.ServiceModel;
10 using System.Text;
11 using System.Threading.Tasks;
12 using Try.Wcf2;
13 
14 namespace Try
15 {
16     [DependsOn(typeof(TryApplicationModule), typeof(TryCoreModule), typeof(TryDataModule),typeof(AbpWebApiModule))]
17     public class TryWcfModule : AbpModule
18     {
19         public override void Initialize()
20         {
21             IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
22 
23             InitServices();
24         }
25 
26         /// <summary>
27         /// 注册WCF服务
28         /// </summary>
29         private void InitServices()
30         {
31             var basicHttpBinding = new BasicHttpBinding()
32             {
33                 MaxBufferPoolSize = 2147483647,
34                 MaxBufferSize = 2147483647,
35                 MaxReceivedMessageSize = 2147483647,
36             };
37 
38             var webHttpBinding = new WebHttpBinding()
39             {
40                 MaxBufferPoolSize = 2147483647,
41                 MaxBufferSize = 2147483647,
42                 MaxReceivedMessageSize = 2147483647,
43             };
44 
45             IocManager.IocContainer.Register
46                 (
47                      Component.For<IStudentService>()
48                      .ImplementedBy<StudentService>()
49                      .Named("StudentService")
50                      .AsWcfService(new DefaultServiceModel().AddEndpoints(WcfEndpoint.BoundTo(basicHttpBinding)).Hosted().PublishMetadata())
51                 );
52 
53             var factory = new WindsorServiceHostFactory<Castle.Facilities.WcfIntegration.Rest.RestServiceModel>(IocManager.IocContainer.Kernel);
54         }
55     }
56 }
View Code

并且在.svc中将表签Service中的内容替换为你注入的服务名称,在上面我注入了一个StudentService服务,那么我在Service这边就是填写Service="StudentService"。如果描述不够清楚,我稍后会放出我做的Demo。

同时说明,该Demo为纯手工建立没有在官网下模板制作的。

Github项目地址服务端

配套客户端(WPF)

转载于:https://www.cnblogs.com/FlyStupidBird/p/8945424.html

<think>好的,我现在需要在ABP框架中使用AutoMapper进行对象映射,但不知道具体怎么操作。首先,用户提到的ABP启动时自动扫描Profile类,可能需要我创建一个继承自AutoMapper.Profile的类。然后,根据引用5中的例子,应该在.Application层添加一个MagBlogAutoMapperProfile.cs文件,并在构造函数中定义映射,比如CreateMap<Post, PostDto>()。这可能就是配置映射的方法。 接下来,用户可能需要在服务使用ObjectMapper进行映射转换。引用1提到通过IObjectMapper接口使用映射,所以在服务中注入IObjectMapper,然后调用Map方法,如将Post实体转换为PostDto。引用5中的例子还展示了如何忽略目标属性,比如.ForMember(x => x.Id, opt => opt.Ignore()),这可能用于更新操作时防止ID被覆盖。 另外,引用3和4提到AutoMapper的惯例配置,可能ABP已经集成了自动注册Profile的功能,所以只要创建正确的Profile类,框架会自动处理。还需要注意是否需要安装Abp.AutoMapper包,引用2提到了Nuget安装,所以可能需要先通过Install-Package Abp.AutoMapper安装包。 可能遇到的问题包括映射配置不正确导致运行时错误,或者忘记注册Profile类。这时候需要检查Profile是否继承自AutoMapper.Profile,并且是否在正确的项目层中。另外,双向映射可能需要分别定义CreateMap<A, B>和CreateMap<B, A>,或者在配置中使用ReverseMap()。 最后,用户可能想验证映射是否正确,这时候可以使用AutoMapper提供的测试方法,如AssertConfigurationIsValid,确保所有属性都被正确映射,避免运行时错误。总之,步骤应该是安装包、创建Profile类、定义映射、在服务使用IObjectMapper进行转换,并进行必要的验证和测试。</think>### 如何在 ABP 框架中使用 AutoMapper 进行对象映射 #### 1. **添加依赖与基本配置** 首先安装 `Abp.AutoMapper` 包: ```bash Install-Package Abp.AutoMapper ``` ABP 框架会自动扫描项目中继承自 `AutoMapper.Profile` 的类,并将其注册到依赖注入系统中[^1]。 --- #### 2. **创建 Profile 类** 在应用层(`.Application` 项目)中定义映射规则。例如,创建一个 `MagBlogAutoMapperProfile.cs`: ```csharp using AutoMapper; using Mag.Blog.Dtos; using Mag.Blog.Entity; namespace Mag.Blog { public class MagBlogAutoMapperProfile : Profile { public MagBlogAutoMapperProfile() { // 定义实体到DTO的映射 CreateMap<Post, PostDto>(); // 定义DTO到实体的映射,忽略Id字段防止覆盖 CreateMap<PostDto, Post>() .ForMember(x => x.Id, opt => opt.Ignore()); } } } ``` 此配置实现了 `Post` 实体与 `PostDto` 之间的双向映射,并忽略更新时的 `Id` 字段[^5]。 --- #### 3. **在服务使用对象映射** 在应用服务中注入 `IObjectMapper` 接口,通过 `Map` 方法转换对象: ```csharp public class PostAppService : ApplicationService { private readonly IRepository<Post> _postRepository; public PostAppService(IRepository<Post> postRepository) { _postRepository = postRepository; } public async Task CreatePost(PostDto input) { var post = ObjectMapper.Map<Post>(input); // DTO转实体 await _postRepository.InsertAsync(post); } public async Task<PostDto> GetPost(Guid id) { var post = await _postRepository.GetAsync(id); return ObjectMapper.Map<PostDto>(post); // 实体转DTO } } ``` 通过 `ObjectMapper` 可避免手动编写赋值代码[^1][^3]。 --- #### 4. **高级配置** - **忽略字段**:使用 `.ForMember(x => x.Field, opt => opt.Ignore())`。 - **条件映射**:通过 `.ForMember(...).Condition(...)` 设置条件逻辑。 - **逆向映射**:若需双向映射,可使用 `CreateMap<A, B>().ReverseMap()`[^5]。 --- #### 5. **验证映射配置** 在单元测试中验证映射规则是否正确: ```csharp [Test] public void Should_HaveValidMappings() { var configuration = new MapperConfiguration(cfg => cfg.AddProfile<MagBlogAutoMapperProfile>()); configuration.AssertConfigurationIsValid(); } ``` 确保所有目标字段均有有效映射路径[^3]。 --- 相关问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值