如果接口位于外部DLL

时间:2017-02-16 10:45:36

标签: c# asp.net-mvc interface

我使用的是asp.net MVC应用程序,在该应用程序中有一个界面

但该接口位于第三方DLL中。所以我无法修改界面。

#region Assembly Sana.Commerce, Version=9.1.3.0, Culture=neutral, PublicKeyToken=2b26dc7ce8e04e9f
// D:\visualstudio2015\Sana Training\SDK\SDK\Libraries\Sana.Commerce.dll
#endregion

using System;
using System.Collections.Generic;
using Sana.Commerce.Customer;
using Sana.Commerce.Shop;

namespace Sana.Commerce.Order
{
    //
    // Summary:
    //     This interface represents an order in the ERP system. This can be an order that
    //     still has to be placed or an order that is already in the ERP (for example order
    //     history). There are several types of orders like regular orders, invoice and
    //     quotes. The type of order is stored in the document type property.
    public interface IOrder : IEntity, IVersionedItem
    {
        //
        // Summary:
        //     ID of the account that placed the order.
        string AccountId { get; set; }
        //
        // Summary:
        //     The type of account that placed this order.
        AccountType AccountType { get; set; }
        //
        // Summary:
        //     Gets or sets the list of order attachments.
        IList<IAttachment> Attachments { get; set; }
        //
        // Summary:
        //     Gets or sets the status of order authorization.
        OrderAuthorizationStatus AuthorizationStatus { get; set; }
        //
        // Summary:
        //     Address that will recieve the invoice.
        ICustomerAddress BillingAddress { get; set; }
        //
        // Summary:
        //     Gets or sets bill-to name.
        string BillToName { get; set; }
        //
        // Summary:
        //     Gets or sets the comment.
        string Comment { get; set; }
        //
        // Summary:
        //     Name of the Contact that placed this order.
        string Contact { get; set; }
        //
        // Summary:
        //     ID of the Contact that placed this order.
        string ContactId { get; set; }
    }
}

但在IOrder中,我必须添加额外的属性ProjectNumber

但是如果它在另一个DLL中,如何扩展IOrder接口?

我这样试试:

public  interface IOrderProjectNumber:IOrder
{
    string ProjectNumber { get; set; }

}

但是我有一个方法,就像这样:

public override IOrder SaveOrder(IOrder order)
{

    IOrderProjectNumber orderNumber= new OrderoverviewModel_ProjectNumber();
    orderNumber.ProjectNumber = "hallo";     

    return base.SaveOrder(order);
}

所以我用这个改变方法:

public override IOrder SaveOrder(IOrderProjectNumber order)
{

    IOrderProjectNumber orderNumber= new OrderoverviewModel_ProjectNumber();
    orderNumber.ProjectNumber = "hallo";     

    return base.SaveOrder(order);
}

但后来我收到了错误:

  

代码描述项目文件行列抑制状态   CS0115'ExtendedOrderManager.SaveOrder(IOrderProjectNumber)':不   找到合适的方法   覆盖Sana.Commerce.Sdk D:\ visualstudio2015 \ Sana   Training \ SDK \ SDK \ Sana.Commerce.Sdk \ Customization \ Order \ ExtendedOrderManager.cs 19 32 Active

它将像xml一样保存:

<Order>
  <field name="BlanketOrderId" type="System.String, mscorlib" storeWithEntity="True">
    <string>BO1</string>
  </field>
  <field name="CustomField" type="System.String, mscorlib" storeWithEntity="False">
    <string>myvalue</string>
  </field>
  <field name="PaymentStatus" type="System.String, mscorlib">
    <string>new</string>
  </field>
  <field name="ProjectNumber" type="Null" />
  <field name="BillingAddress" type="Sana.Commerce.Customer.CustomerAddress, Sana.Commerce.Sdk">
    <CustomerAddress>
      <field name="CustomerId" type="System.String, mscorlib">
        <string>01454545</string>
      </field>
      <field name="Address" type="System.String, mscorlib">
        <string>705 West Peachtree Street</string>
      </field>
      <field name="Address2" type="System.String, mscorlib">
        <string />
      </field>
      <field name="ZipCode" type="System.String, mscorlib">
        <string>US-GA 31772</string>
      </field>
      <field name="City" type="System.String, mscorlib">
        <string>Atlanta</string>
      </field>
      <field name="CountryId" type="System.String, mscorlib">
        <string>US</string>
      </field>
      <field name="CountryName" type="System.String, mscorlib">
        <string>Verenigde Staten</string>
      </field>
      <field name="State" type="System.String, mscorlib">
        <string />
      </field>
      <field name="PhoneNo" type="System.String, mscorlib">
        <string />
      </field>
      <field name="FaxNo" type="System.String, mscorlib">
        <string />
      </field>
      <field name="Contact" type="System.String, mscorlib">
        <string>Ms. Tammy L. McDonald</string>
      </field>
      <field name="ContactId" type="Null" />
      <field name="Name" type="System.String, mscorlib">
        <string>New Concepts Furniture</string>
      </field>
      <field name="Id" type="Null" />
      <field name="WebsiteId" type="Null" />
    </CustomerAddress>
  </field>

并在Order类中。我把额外的财产:

public class Order : Entity, IOrder
    {
        #region Properties

        /// <summary>
        /// Status of the Payment of this order.
        /// </summary>
        [DataMember]
        public string PaymentStatus { get; set; }



        [DataMember]
        [XmlField]
        public string ProjectNumber { get; set; }
}

系统使用依赖注入以及注册模型和控制器的位置。注册新类将在Addone类中完成,如下所示:

public class Addon : IAddon
    {
        public int Order
        {
            get { return 0; }
        }

        public void Initialize()
        {
            ObjectManager.RegisterType<IController, ReturnOrdersController>("ReturnOrders");
            ObjectManager.RegisterType<OrderOverviewModel, OrderoverviewModel_ProjectNumber>();
        }
    }

这是OrderoverViewModel:

//
    // Summary:
    //     The order overview page model.
    public class OrderOverviewModel : CheckoutBaseViewModel
    {
        public OrderOverviewModel();

        //
        // Summary:
        //     Gets or sets a value indicating that the terms and conditions is confirmed.
        [MustBeTrue(ErrorMessageResourceName = "OrderOverview_AgreeTermsError")]
        public virtual System.Boolean AcceptTerms { get; set; }
        //
        // Summary:
        //     Gets or sets the comments.
        [AllowHtml]
        [DataType(DataType.MultilineText)]
        [Display(Name = "Comments")]
        [MaxLength(2048, ErrorMessageResourceName = "Validation_MaxLength")]
        public virtual System.String Comments { get; set; }
        //
        // Summary:
        //     Gets or sets the delivery date.
        [Display(Name = "RequestedDeliveryDate")]
        [GreaterThanToday(ErrorMessageResourceName = "Validation_InvalidField")]
        public virtual Date? DeliveryDate { get; set; }
        //
        // Summary:
        //     Gets or sets a value indicating that the order will be paid online.
        public virtual System.Boolean IsPaidOnline { get; set; }
        //
        // Summary:
        //     Gets or sets the reference number.
        [AllowHtml]
        [Display(Name = "ReferenceNumber")]
        [MaxLength(20, ErrorMessageResourceName = "Validation_MaxLength")]
        public virtual System.String ReferenceNumber { get; set; }
        //
        // Summary:
        //     Gets or sets a value indicating whether additional information will be visible.
        public virtual System.Boolean ShowAdditionalInformation { get; set; }

        //
        // Summary:
        //     Applies the model changes to the specified basket.
        //
        // Parameters:
        //   basket:
        //     The basket to update.
        //
        // Returns:
        //     Returns a value indicating whether any changes have been done to the basket.
        public virtual System.Boolean ApplyChanges(IBasket basket);
        //
        // Summary:
        //     Initializes the model using the specified basket.
        //
        // Parameters:
        //   basket:
        //     The basket.
        public virtual void Initialize(IBasket basket);
        //
        // Summary:
        //     Initializes the model.
        //
        // Parameters:
        //   context:
        //     The shop context.
        //
        //   generalInfo:
        //     The checkout general info model.
        public virtual void InitializeGeneral(ShopContext context, CheckoutGeneralInfo generalInfo);
    }

这仍然是空的:

public  interface IOrderProjectNumber : IOrder
    {
        string ProjectNumber { get; set; }
        //public virtual IOrder SaveOrder(IOrder order);

    }

 var orderObject = order as DomainModel.Order.IOrderProjectNumber;

orderObject仍然为null。我不明白。

1 个答案:

答案 0 :(得分:0)

您的SaveOrder方法应如下所示:

public override IOrder SaveOrder(IOrder order)
{    
    var orderObject = order as Order;

    if(orderObject != null)
    {
        orderObject.ProjectNumber = "hallo";     
    }

    return base.SaveOrder(order);
}