2

我正在尝试扩展 webservice plygin 以便从 nopcommerce 获取产品列表。

我所做的是以下。我创建了一个类似的类ProductDto,并在里面NopService.cs创建了一个类似的方法:

public List<ProductDto> GetProductCollection(string usernameOrEmail, string userPassword)

ProductDto取自Product使用 AutoMapper。(如下图)

但它不起作用:(我错过了什么?

有任何想法吗?这一切背后的想法是通过网络服务将 nopcommerce 与我的 ERP 连接起来

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Nop.Core.Domain.Catalog
{
    public class ProductDto
    {
        public virtual string Name { get; set; }

        // Instance members must be virtual on data table objects like Affiliate.cs
        // Virtual is required by data access frameworks so that these frameworks
        // can implement more complex features like lazy loading.

        public virtual string ProductGID { get; set; }

        /// <summary>
        /// Gets or sets the short description
        /// </summary>

        public virtual string ShortDescription { get; set; }

        /// <summary>
        /// Gets or sets the full description
        /// </summary>

        public virtual string FullDescription { get; set; }

        /// <summary>
        /// Gets or sets the admin comment
        /// </summary>

        public virtual string AdminComment { get; set; }

        /// <summary>
        /// Gets or sets a value of used product template identifier
        /// </summary>

        public virtual int ProductTemplateId { get; set; }

        /// <summary>
        /// Gets or sets a value indicating whether to show the product on home page
        /// </summary>

        public virtual bool ShowOnHomePage { get; set; }

        /// <summary>
        /// Gets or sets the meta keywords
        /// </summary>

        public virtual string MetaKeywords { get; set; }

        /// <summary>
        /// Gets or sets the meta description
        /// </summary>

        public virtual string MetaDescription { get; set; }

        /// <summary>
        /// Gets or sets the meta title
        /// </summary>

        public virtual string MetaTitle { get; set; }

        /// <summary>
        /// Gets or sets the search-engine name
        /// </summary>

        public virtual string SeName { get; set; }

        /// <summary>
        /// Gets or sets a value indicating whether the product allows customer reviews
        /// </summary>

        public virtual bool AllowCustomerReviews { get; set; }

        /// <summary>
        /// Gets or sets the rating sum (approved reviews)
        /// </summary>

        public virtual int ApprovedRatingSum { get; set; }

        /// <summary>
        /// Gets or sets the rating sum (not approved reviews)
        /// </summary>

        public virtual int NotApprovedRatingSum { get; set; }

        /// <summary>
        /// Gets or sets the total rating votes (approved reviews)
        /// </summary>

        public virtual int ApprovedTotalReviews { get; set; }

        /// <summary>
        /// Gets or sets the total rating votes (not approved reviews)
        /// </summary>

        public virtual int NotApprovedTotalReviews { get; set; }

        /// <summary>
        /// Gets or sets a value indicating whether the entity is published
        /// </summary>

        public virtual bool Published { get; set; }

        /// <summary>
        /// Gets or sets a value indicating whether the entity has been deleted
        /// </summary>

        public virtual bool Deleted { get; set; }

        /// <summary>
        /// Gets or sets the date and time of product creation
        /// </summary>

        public virtual DateTime CreatedOnUtc { get; set; }

        /// <summary>
        /// Gets or sets the date and time of product update
        /// </summary>

        public virtual DateTime UpdatedOnUtc { get; set; }
    }
}

在 NopService.cs 我创建了一个这样的方法

public List<ProductDto> GetProductCollection(string usernameOrEmail, string userPassword)
    {
        CheckAccess(usernameOrEmail, userPassword);
        if (!_permissionSettings.Authorize(StandardPermissionProvider.ManageCatalog))
            throw new ApplicationException("Not allowed to manage Catalog");

        var productslist = new List<Product>();
        productslist.AddRange(_productService.GetAllProducts(false));
        List<Product> products = productslist;
        List<ProductDto> productsDtos = Mapper.Map<List<Product>, List<ProductDto>>(products);

        return productsDtos;
    }
}
4

2 回答 2

1

您的映射只能在启动期间配置一次。因此,尝试将其移至个人资料:

namespace MyNamespace
{
    using System.Collections.Generic;

    using AutoMapper;

    public class ProductProfile : Profile
    {
        public override string ProfileName
        {
            get
            {
                return "ProductProfile";
            }
        }

        protected override void Configure()
        {
            Mapper.CreateMap<Product, ProductDto>();
            Mapper.CreateMap<ProductCategory, ProductCategoryDto>();
            // etc
        }
    }
}

然后在启动期间对其进行初始化(Application_Start等):

Mapper.Initialize(m => m.AddProfile<ProductProfile>());

创建一个单元测试来检查您的映射:

namespace MyNamespace
{
    using System.Collections.Generic;

    using AutoMapper;

    using NUnit.Framework;

    [TestFixture]
    public class AutoMapperTests
    {
        [Test]
        public void AutoMapper_Configuration_IsValid()
        {
            Mapper.Initialize(m => m.AddProfile<ProductProfile>());
            Mapper.AssertConfigurationIsValid();
        }
    }
}

这将有助于确定您的映射配置中是否存在任何错误,并向您展示要修复的内容。完成此操作后,您就可以专注于使功能正常工作。

于 2012-11-22T02:30:22.547 回答
0

我设法让它工作,但在映射嵌套类时遇到问题。

产品类别

public partial class Product : BaseEntity, ILocalizedEntity
{


    private ICollection<ProductVariant> _productVariants;


    private ICollection<ProductCategory> _productCategories;


    private ICollection<ProductManufacturer> _productManufacturers;


    private ICollection<ProductPicture> _productPictures;


    private ICollection<ProductReview> _productReviews;


    private ICollection<ProductSpecificationAttribute> _productSpecificationAttributes;


    private ICollection<ProductTag> _productTags;

    /// <summary>
    /// Gets or sets the name
    /// </summary>

    public virtual string Name { get; set; }

    // Instance members must be virtual on data table objects like Affiliate.cs
    // Virtual is required by data access frameworks so that these frameworks
    // can implement more complex features like lazy loading.

    public virtual string ProductGID { get; set; }

    /// <summary>
    /// Gets or sets the short description
    /// </summary>

    public virtual string ShortDescription { get; set; }

    /// <summary>
    /// Gets or sets the full description
    /// </summary>

    public virtual string FullDescription { get; set; }

    /// <summary>
    /// Gets or sets the admin comment
    /// </summary>

    public virtual string AdminComment { get; set; }

    /// <summary>
    /// Gets or sets a value of used product template identifier
    /// </summary>

    public virtual int ProductTemplateId { get; set; }

    /// <summary>
    /// Gets or sets a value indicating whether to show the product on home page
    /// </summary>

    public virtual bool ShowOnHomePage { get; set; }

    /// <summary>
    /// Gets or sets the meta keywords
    /// </summary>

    public virtual string MetaKeywords { get; set; }

    /// <summary>
    /// Gets or sets the meta description
    /// </summary>

    public virtual string MetaDescription { get; set; }

    /// <summary>
    /// Gets or sets the meta title
    /// </summary>

    public virtual string MetaTitle { get; set; }

    /// <summary>
    /// Gets or sets the search-engine name
    /// </summary>

    public virtual string SeName { get; set; }

    /// <summary>
    /// Gets or sets a value indicating whether the product allows customer reviews
    /// </summary>

    public virtual bool AllowCustomerReviews { get; set; }

    /// <summary>
    /// Gets or sets the rating sum (approved reviews)
    /// </summary>

    public virtual int ApprovedRatingSum { get; set; }

    /// <summary>
    /// Gets or sets the rating sum (not approved reviews)
    /// </summary>

    public virtual int NotApprovedRatingSum { get; set; }

    /// <summary>
    /// Gets or sets the total rating votes (approved reviews)
    /// </summary>

    public virtual int ApprovedTotalReviews { get; set; }

    /// <summary>
    /// Gets or sets the total rating votes (not approved reviews)
    /// </summary>

    public virtual int NotApprovedTotalReviews { get; set; }

    /// <summary>
    /// Gets or sets a value indicating whether the entity is published
    /// </summary>

    public virtual bool Published { get; set; }

    /// <summary>
    /// Gets or sets a value indicating whether the entity has been deleted
    /// </summary>

    public virtual bool Deleted { get; set; }

    /// <summary>
    /// Gets or sets the date and time of product creation
    /// </summary>

    public virtual DateTime CreatedOnUtc { get; set; }

    /// <summary>
    /// Gets or sets the date and time of product update
    /// </summary>

    public virtual DateTime UpdatedOnUtc { get; set; }

    /// <summary>
    /// Gets or sets the product variants
    /// </summary>


    public virtual ICollection<ProductVariant> ProductVariants
    {
        get { return _productVariants ?? (_productVariants = new List<ProductVariant>()); }
        protected set { _productVariants = value; }
    }
    /// <summary>
    /// Gets or sets the collection of ProductCategory
    /// </summary>
    public virtual ICollection<ProductCategory> ProductCategories
    {
        get { return _productCategories ?? (_productCategories = new List<ProductCategory>()); }
        protected set { _productCategories = value; }
    }

    /// <summary>
    /// Gets or sets the collection of ProductManufacturer
    /// </summary>
    public virtual ICollection<ProductManufacturer> ProductManufacturers
    {
        get { return _productManufacturers ?? (_productManufacturers = new List<ProductManufacturer>()); }
        protected set { _productManufacturers = value; }
    }

    /// <summary>
    /// Gets or sets the collection of ProductPicture
    /// </summary>

    public virtual ICollection<ProductPicture> ProductPictures
    {
        get { return _productPictures ?? (_productPictures = new List<ProductPicture>()); }
        protected set { _productPictures = value; }
    }

    /// <summary>
    /// Gets or sets the collection of product reviews
    /// </summary>

    public virtual ICollection<ProductReview> ProductReviews
    {
        get { return _productReviews ?? (_productReviews = new List<ProductReview>()); }
        protected set { _productReviews = value; }
    }

    /// <summary>
    /// Gets or sets the product specification attribute
    /// </summary>

    public virtual ICollection<ProductSpecificationAttribute> ProductSpecificationAttributes
    {
        get { return _productSpecificationAttributes ?? (_productSpecificationAttributes = new List<ProductSpecificationAttribute>()); }
        protected set { _productSpecificationAttributes = value; }
    }

    /// <summary>
    /// Gets or sets the product specification attribute
    /// </summary>

    public virtual ICollection<ProductTag> ProductTags
    {
        get { return _productTags ?? (_productTags = new List<ProductTag>()); }
        protected set { _productTags = value; }
    }

}

}

ProductDto 类

public class ProductDto
{



    private ICollection<ProductCategoryDto> _productCategories;




    public virtual string Name { get; set; }

    // Instance members must be virtual on data table objects like Affiliate.cs
    // Virtual is required by data access frameworks so that these frameworks
    // can implement more complex features like lazy loading.

    public virtual string ProductGID { get; set; }

    /// <summary>
    /// Gets or sets the short description
    /// </summary>

    public virtual string ShortDescription { get; set; }

    /// <summary>
    /// Gets or sets the full description
    /// </summary>

    public virtual string FullDescription { get; set; }

    /// <summary>
    /// Gets or sets the admin comment
    /// </summary>

    public virtual string AdminComment { get; set; }

    /// <summary>
    /// Gets or sets a value of used product template identifier
    /// </summary>

    public virtual int ProductTemplateId { get; set; }

    /// <summary>
    /// Gets or sets a value indicating whether to show the product on home page
    /// </summary>

    public virtual bool ShowOnHomePage { get; set; }

    /// <summary>
    /// Gets or sets the meta keywords
    /// </summary>

    public virtual string MetaKeywords { get; set; }

    /// <summary>
    /// Gets or sets the meta description
    /// </summary>

    public virtual string MetaDescription { get; set; }

    /// <summary>
    /// Gets or sets the meta title
    /// </summary>

    public virtual string MetaTitle { get; set; }

    /// <summary>
    /// Gets or sets the search-engine name
    /// </summary>

    public virtual string SeName { get; set; }

    /// <summary>
    /// Gets or sets a value indicating whether the product allows customer reviews
    /// </summary>

    public virtual bool AllowCustomerReviews { get; set; }

    /// <summary>
    /// Gets or sets the rating sum (approved reviews)
    /// </summary>

    public virtual int ApprovedRatingSum { get; set; }

    /// <summary>
    /// Gets or sets the rating sum (not approved reviews)
    /// </summary>

    public virtual int NotApprovedRatingSum { get; set; }

    /// <summary>
    /// Gets or sets the total rating votes (approved reviews)
    /// </summary>

    public virtual int ApprovedTotalReviews { get; set; }

    /// <summary>
    /// Gets or sets the total rating votes (not approved reviews)
    /// </summary>

    public virtual int NotApprovedTotalReviews { get; set; }

    /// <summary>
    /// Gets or sets a value indicating whether the entity is published
    /// </summary>

    public virtual bool Published { get; set; }

    /// <summary>
    /// Gets or sets a value indicating whether the entity has been deleted
    /// </summary>

    public virtual bool Deleted { get; set; }

    /// <summary>
    /// Gets or sets the date and time of product creation
    /// </summary>

    public virtual DateTime CreatedOnUtc { get; set; }

    /// <summary>
    /// Gets or sets the date and time of product update
    /// </summary>

    public virtual DateTime UpdatedOnUtc { get; set; }

    /// <summary>
    /// Gets or sets the collection of ProductCategory
    /// </summary>
    public virtual ICollection<ProductCategoryDto> ProductCategories
    {
        get { return _productCategories ?? (_productCategories = new List<ProductCategoryDto>()); }
        protected set { _productCategories = value; }
    }



}

}

产品类别类

public partial class ProductCategory : BaseEntity
{
     public virtual int ProductId { get; set; }

    /// <summary>
    /// Gets or sets the category identifier
    /// </summary>
    public virtual int CategoryId { get; set; }

    /// <summary>
    /// Gets or sets a value indicating whether the product is featured
    /// </summary>
     public virtual bool IsFeaturedProduct { get; set; }

    /// <summary>
    /// Gets or sets the display order
    /// </summary>
     public virtual int DisplayOrder { get; set; }

    /// <summary>
    /// Gets the category
    /// </summary>
     public virtual Category Category { get; set; }

    /// <summary>
    /// Gets the product
    /// </summary>
     public virtual Product Product { get; set; }

}

和 ProductCategoryDto 类

public class ProductCategoryDto

{
    /// <summary>
    /// Gets or sets the product identifier
    /// </summary>
    public virtual int ProductId { get; set; }

    /// <summary>
    /// Gets or sets the category identifier
    /// </summary>
    public virtual int CategoryId { get; set; }

    /// <summary>
    /// Gets or sets a value indicating whether the product is featured
    /// </summary>
    public virtual bool IsFeaturedProduct { get; set; }

    /// <summary>
    /// Gets or sets the display order
    /// </summary>
    public virtual int DisplayOrder { get; set; }

    /// <summary>
    /// Gets the category
    /// </summary>
    public virtual CategoryDto Category { get; set; }

    /// <summary>
    /// Gets the product
    /// </summary>
    public virtual ProductDto Product { get; set; }
}

映射是在这样的方法中完成的

public List<ProductDto> GetProductCollection(string usernameOrEmail, string userPassword)

    {
        CheckAccess(usernameOrEmail, userPassword);
        if (!_permissionSettings.Authorize(StandardPermissionProvider.ManageCatalog))
            throw new ApplicationException("Not allowed to manage Catalog");

        List<Product> productslist = new List<Product>();
        productslist.AddRange(_productService.GetAllProducts(false));
        List<ProductCategory> productCategorylist = new List<ProductCategory>();
        foreach (var product in productslist)
        {
            productCategorylist.AddRange(_categoryService.GetProductCategoriesByProductId(product.Id, false));


        }



        Mapper.CreateMap<Product, ProductDto>();

        Mapper.CreateMap<ProductCategory, ProductCategoryDto>();
        List<ProductDto> productsDto = Mapper.Map<List<Product>, List<ProductDto>>(productslist);
        List<ProductCategoryDto> productCategoriesDto = Mapper.Map<List<ProductCategory>, List<ProductCategoryDto>>(productCategorylist);


        return productsDto;

    }

问题是我从来没有得到从 ProductDto 到 ProductCategoriesDto 的 Icollection 的映射。其他一切正常。

于 2012-11-21T12:04:36.903 回答