接口是否可以配置为由于存在对象而强制进行类定义?

时间:2017-02-01 18:17:20

标签: c# inheritance interface

我正致力于一个能够在两个宁静服务之间双向同步CRM数据的框架。

除此之外,我还定义了一组具有公共基类的对象,以及一些表示同时具有公共基类的服务的类。

我为对象和服务定义了一些稀疏接口。

我遇到的一个问题是如何以及在何处存储有关宁静通信的信息。例如,要在一个服务上创建或更新客户,它必须使用" / customer"和PUT。如果我想在另一方面做,那么" /个人"和POST。等等。

到目前为止,我已经创建了一个可重复使用的" RestConfig"能够持有这些信息的类。

由于此特定于服务的API信息不太可能发生变化,因此我将其存储在对象中,以便在需要时进行调用。它很容易完成,但我真的很想强制为我创建的继承的基本SERVICE类的每个实例添加这个类对象。

我这样做部分是为了学术界的练习,要了解这是否可行。我已经知道如何通过添加RestConfig类型的公共属性并手动保湿来实现它...但我离题了。

我的同事告诉我,我应该在服务中定义它,但我的目标是创建一个非常简单的模型,一旦配置完成,你只需要使用object.save(serviceEnvironment);

我老实说非常接近有一个有效的例子,但我真的想知道它是否有可能做我上面解释过的。

对不起,如果这太荒谬了。我期待看到一些问题......我将进行编辑以澄清。

编辑1:分享代码

对象示例:

public class Customer : 
    EntityBase
    {

        public Customer() : base(new EntityBaseConfig("customer", Customer.RestFullConfig))
        {

        }

        [MagentoJsonDetails(PropertyName = "website_id", IsId = true, BasePath = JsonDetailsBase.JsonBasePath.Root, JsonValueType = typeof(int))]
        public int WebsiteId => 1;

        [MagentoJsonDetails(PropertyName = "store_id", IsId = true, BasePath = JsonDetailsBase.JsonBasePath.Root, JsonValueType = typeof(int))]
        public int StoreId => 1;

        [MagentoJsonDetails(PropertyName = "addresses", BasePath = JsonDetailsBase.JsonBasePath.Root, JsonValueType = typeof(List<Address.Address>))]
        public List<Address.Address> Addresses { get; set; }

        [MagentoJsonDetails(PropertyName = "group_id", IsId = true, BasePath = JsonDetailsBase.JsonBasePath.Root, JsonValueType = typeof(int))]
        [UseInHash(Position = 12)]
        public int GroupId { get; set; }

服务示例:

public class MagentoSttiService : SttiServiceBase, ISttiService
{
    public SttiServiceEnvironment SttiServiceEnv { get; set; }

    public MagentoSttiService() : this(null)
    {

    }

    public MagentoSttiService(SttiServiceEnvironment env)
    {
        this.SttiServiceEnv = env;
    }

    public string SimpleGet(EntityBase entity, string json)
    {
        throw new NotImplementedException();
    }

    public string SimpleDelete(EntityBase entity, string json)
    {
        throw new NotImplementedException();
    }

    public string SimpleSave(EntityBase entity, string json)
    {
        Dictionary<SttiServiceBase.RestFullServiceConfig, string> restConfig = entity.EbConfig.RestFullConfig;

        string method = restConfig[SttiServiceBase.RestFullServiceConfig.Method];
        string url = restConfig[SttiServiceBase.RestFullServiceConfig.Url];

        if (entity.NKIId > 0)
        {
            method = WebRequestMethods.Http.Put;
            url += entity.NKIId.ToString();
        }

        return this.MakeCall(method, url, json);

    }

如何使用它的例子:

string json = "{\"id\":30,\"group_id\":98,\"default_billing\":\"2\",\"default_shipping\":\"2\",\"created_at\":\"2016-10-31 14:42:59\",\"updated_at\":\"2016-10-31 15:16:30\",\"created_in\":\"Default Store View\",\"dob\":\"1980-07-09\",\"email\":\"mitch@stti.org\",\"firstname\":\"Mitchell\",\"lastname\":\"Thompson\",\"middlename\":\"David\",\"prefix\":\"Mr\",\"suffix\":\"na\",\"gender\":1,\"store_id\":1,\"website_id\":1,\"addresses\":[{\"id\":2,\"customer_id\":30,\"region\":{\"region_code\":\"IN\",\"region\":\"Indiana\",\"region_id\":24},\"region_id\":24,\"country_id\":\"US\",\"street\":[\"550 West North Street\",\"IT Department\"],\"company\":\"Sigma Theta Tau Intlll\",\"telephone\":\"7655555555\",\"postcode\":\"46202\",\"city\":\"Indianapolis\",\"firstname\":\"Mitchell\",\"lastname\":\"Thompson\",\"middlename\":\"D\",\"default_shipping\":true,\"default_billing\":true,\"custom_attributes\":[{\"attribute_code\":\"cxa_key\",\"value\":\"5ecc8a60-8878-4c87-9734-26fc83dca15c\"}]}],\"disable_auto_group_change\":0,\"custom_attributes\":[{\"attribute_code\":\"stti_position\",\"value\":\"450,451,452\"},{\"attribute_code\":\"cst_key\",\"value\":\"3b4d43ba-bcc7-4255-9d25-d79f0035b7f6\"},{\"attribute_code\":\"constit_id\",\"value\":\"123456\"},{\"attribute_code\":\"cust_save_hash\",\"value\":\"thisIsATestHashThing\"},{\"attribute_code\":\"stti_specialty\",\"value\":\"413,414,415\"}]}";

            SttiServiceEnvironment sse = new SttiServiceEnvironment("http://192.168.5.65", "quwtldm4xa1a8bx1lncvwdlchuum1iee");

    // Newtonsoft parse the data into an object
    JObject data = JObject.Parse(json);

    // This just makes json into a Customer object 
    MagentoJsonConverter jConverter = new MagentoJsonConverter(typeof(MagentoJsonDetailsAttribute));

    Customer customerObjectData = jConverter.ConvertTo<Customer>(data);

    // Fricken save for Magento
    customerObjectData.Sync<MagentoSttiService>(jConverter, sse);

编辑2:将此添加到我的对象的基类

public virtual void Sync<T>(IJsonConverter jConverter, SttiServiceEnvironment servEnv) where T : ISttiService, new()
    {
        // Pass arguments to T() that are defined in the interface
        ISttiService srv = new T() { SttiServiceEnv = servEnv };
        string json = jConverter.GetJson(this);
        srv.SimpleSave(this, json);
    }

0 个答案:

没有答案