Unity Resolve> проблемы - PullRequest
       13

Unity Resolve> проблемы

2 голосов
/ 28 марта 2012

возможно ли разрешать объекты, которые используют дженерики в единстве, только с помощью интерфейсов.

class

public interface ItestObject<T>{ T Create();}
public class testObject<T> : ItestObject<T> where T: class, ICMSBasicTextData, new()
{
    public testObject(){}

    public T Create()
    {
        return new T();
    }
}

xml config

<alias alias="testObject_I" type="JMJoinery.ItestObject`1, JMJoinery" />
<alias alias="testObject_C" type="JMJoinery.testObject`1[[JMJoinery.CMS.Data.CMSBasicTextData, JMJoinery]], JMJoinery" />
<alias alias="CMSBasicTextData_I" type="JMJoinery.CMS.Data.ICMSBasicTextData, JMJoinery" />
<alias alias="CMSBasicTextData_C" type="JMJoinery.CMS.Data.CMSBasicTextData, JMJoinery" />

<register name="CMSBasicTextData_R" type="CMSBasicTextData_I" mapTo="CMSBasicTextData_C" />
<register name="test" type="testObject_I" mapTo="testObject_C" />

, когда я пытаюсь разрешить:

var o2 = JMJoinery.Global.Container.Resolve<ItestObject<ICMSBasicTextData>>();

возникает эта ошибка:

"Невозможно привести объект типа 'JMJoinery.testObject 1[JMJoinery.CMS.Data.CMSBasicTextData]' to type 'JMJoinery.ItestObject 1 [JMJoinery.CMS.Data.ICMSBasicTextData]'."

Использование

Container.Resolve<ItestObject<CMSBasicTextData>>();

работает, но можно ли разрешить, используя только интерфейс

Container.Resolve<ItestObject<ICMSBasicTextData>>();

вместо?

1 Ответ

0 голосов
/ 28 марта 2012

Интерфейс и реализация

public interface ILookupDataReader<T>
{

    string LookupTypeID { get; }


}


public class CountryDataReader: ILookupDataReader<ICountry>
{


    string ILookupDataReader<ICountry>.LookupTypeID
    {
        get { return Enum.GetName(typeof(LookupTypeOptions), LookupTypeOptions.Country); }
    }
}

Регистрация

<alias alias="ILookupDataReader" type="Co.Application.Shared.Core.BusinessObject.ILookupDataReader`1,Co.Shared.Impl"/>
<alias alias="ICountry" type="Co.Application.Shared.Core.BusinessObject.Lookup.ICountry,                             Co.Shared.Impl"/>

<register type="ILookupDataReader[ICountry]" mapTo="Co.Application.Shared.Core.BusinessObject.Lookup.CountryDataReader,Co.Shared.Impl">
      <lifetime type="singleton"/>
    </register>

Usage

[Dependency]
public ILookupDataReader<ICountry> CountryLookup { get; set; }
...