Проблема с инъекцией зависимостей C # - PullRequest
1 голос
/ 01 июля 2010

У меня есть несколько классов, которые реализуют один и тот же интерфейс.

interface IBidManager<E> where E : IEntity

public class BidManager : IBidManager<EntityObject1>
public class BidManager2 : IBidManager<EntityObject2>
public class BidManager3 : IBidManager<EntityObject3>

В моем классе бизнес-менеджера у меня есть:

public class BusinessManager : ManagerBase
{
    private IBidManager<IEntity> _bidLogicManager;
    ...

В BusinessManager есть функция, которую я вызываю для изменения_bidLogicManager (MyType - это перечисление)

public void SetLogic(MyType auctionType)
{
    switch (MyType)
    {
        case AuctionType.Classic:
            _bidLogicManager = (IBidManager<IEntity>)new BidManager();
            break;
  ...

IEntity - пустой интерфейс, который я использую со своими классами POCO, сгенерированными t4 и платформой Entity.

Я мог бы поклясться, что это работает, но я попробовал еще раз, и его ошибка выдачи sayng:

Unable to cast object of type 'BLL.MyManagers.BidManager' to type 'BLL.BidManagers.IBidManager`1[Entities.IEntity]'.

Когда я удаляю (IBidManager), Visual Studio сообщает мне, что явное преобразование существует ... но что это?

Я не хочу определять тип при создании класса BusinessManager следующим образом:

public class BusinessManager<E> : ManagerBase where E : class, IEntity
{
      IBidManager<E> _bidLogicManager;

Кроме того, я не могу создать функцию в Бизнес-менеджере, которая принимает аргумент IBidManager<E>, так как это n-слойприложение asp.net и я не хочу, чтобы слой пользовательского интерфейса знал что-либо о IBidManager

1 Ответ

1 голос
/ 01 июля 2010

Если вы можете использовать .Net 4.0, вы можете решить свою проблему при помощи ковариации.

interface IBidManager<out E> where E : IEntity.
...