2

nopcommerce から製品リストを取得するために、webservice plygin を拡張しようとしています。

私がやったことは次のとおりです。のようなクラスを作成しProductDto、内部でNopService.cs次のようなメソッドを作成しました。

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

ProductDtoProductAutoMapperを使用して取得されます。(下に示された)

しかし、それは機能しません:(何が欠けていますか?

何か案は?これらすべての背後にあるアイデアは、Web サービスを介して 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; }
    }



}

}

ProductCategory クラス

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 に答える