簡體   English   中英

如何在MEF合成引擎中結合a)MEF和Generics?

[英]How to combine a) MEF and Generics in MEF composition engine?

我在MEF中有以下程序

方法1:

public ObjectResult<PartnerListingStatement> GetCommissionListingRecords(string uRL, PortalConstant.DataSourceType DataSourceType)
        {  

            ObjectResult<PartnerListingStatement> lstCommissionPartner = null;

            var dataPlugin = DataPlugins.FirstOrDefault(i => i.Metadata["SQLMetaData"].ToString() == DataSourceType.EnumToString());

            if (dataPlugin != null)
            {
                lstCommissionPartner = dataPlugin.Value.GetCommissionListingRecords(uRL);
            }
            return lstCommissionPartner;
        }

方法B.

public ObjectResult<CommissionEarned> GetCommissionPaidToPartners(string uRL, PortalConstant.DataSourceType DataSourceType)
        {
            ObjectResult<CommissionEarned> lstCommissionEarned = null;

            var dataPlugin = DataPlugins.FirstOrDefault(i => i.Metadata["SQLMetaData"].ToString() == DataSourceType.EnumToString());

            if (dataPlugin != null)
            {
                lstCommissionEarned = dataPlugin.Value.GetCommissionPaidToPartners(uRL);
            }
            return lstCommissionEarned;
        }

使用泛型等可以組合這兩者。 數據類型也不同。 NB~這個問題與從客戶端訪問WCF服務的Generics程序不同

謝謝

在詢問“我可以結合這些方法嗎?”之后要問的第一個問題。 是“這些方法有什么共同之處?” 我的情況,答案是這樣的:

public ObjectResult<***SomeType***> GetValues(string uRL, PortalConstant.DataSourceType DataSourceType)
{
    ObjectResult<***SomeType***> ret = null;

    var dataPlugin = DataPlugins.FirstOrDefault(i => i.Metadata["SQLMetaData"].ToString() == DataSourceType.EnumToString());

    if (dataPlugin != null)
    {
        ret = dataPlugin.Value.***SomeMethod***(uRL);
    }
    return ret;
}

其中***SomeType******SomeMethod***是方法之間的兩個有意義的差異。 處理類型,使方法通用,並用泛型參數替換所有***SomeType*** 要處理該方法,請向該方法添加委托參數。 根據其使用情況,委托將是的Func<PluginType, string, ObjectResult<***SomeType***>>類型,其中PluginType是任何類型dataPlugin.Value是。 現在你有:

public ObjectResult<T> GetValues<T>( //do come up with a better name
    string uRL, 
    PortalConstant.DataSourceType DataSourceType,
    Func<PluginType, string, ObjectResult<T>> resultSelector)
{
    ObjectResult<T> ret = null;

    var dataPlugin = DataPlugins.FirstOrDefault(i => i.Metadata["SQLMetaData"].ToString() == DataSourceType.EnumToString());

    if (dataPlugin != null)
    {
        ret = resultSelector(dataPlugin.Value, uRL);
    }
    return ret;
}

這是將GetCommissionListingRecords更改為(應該推斷泛型類型)

GetValues(uRL, DataSourceType, (p, u) => p.GetCommissionListingRecords(u));

和其他方法類似。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM