NopCommerce网络服务DTO

时间:2012-11-20 13:44:29

标签: automapper dto nopcommerce

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

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

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

ProductDto取自Product,使用AutoMapper。 (如下所示)

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

有什么想法吗?所有这一切背后的想法是通过webservices将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;
    }
}

2 个答案:

答案 0 :(得分: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();
        }
    }
}

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

答案 1 :(得分: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 Class

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; }
    }



}

}

ProductCategory Class

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 Class

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到Icollection Of ProductCategoriesDto的映射。其他一切都很好。