Как совместить а) MEF и Generics в MEF движок композиции? - PullRequest
0 голосов
/ 12 января 2012

У меня есть программа ниже в 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;
        }

Используя дженерики или тому подобное, можно объединить эти два. Также типы данных разные. N.B. ~ Этот вопрос отличается от Общей программы для доступа к службе WCF с клиента

Спасибо

1 Ответ

2 голосов
/ 12 января 2012

Первый вопрос, который нужно задать после вопроса "Могу ли я объединить эти методы?"такое "Что общего у этих методов?"В вашем случае ответ на этот вопрос будет примерно таким:

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

и аналогично для другого метода.

...