Проблема реализации универсального интерфейса - PullRequest
2 голосов
/ 29 июля 2010

У меня есть базовая DLL, которая определяет некоторую базовую структуру и работу для ключевой концепции в нашем бизнесе. Эта DLL затем включается в определенные веб-сервисы для каждого поставщика, которые реализуют определенные бизнес-правила для взаимодействия с этим поставщиком. (Хотя основные концепции одинаковы, реализации очень разные и могут изменяться независимо.)

В базовой DLL у меня есть ряд интерфейсов, настроенных как таковые

public interface IVendor
{
    string Name { get; set; }    
}

public interface IVendor<TC> : IVendor where TC : IAccount
{
    IEnumerable<TC> Accounts { get; set; }
}

public interface IAccount
{
    string Name { get; set; }
}

public interface IAccount<TP, TC> : IAccount where TP : IVendor
                                             where TC : IExecutionPeriod
{
    TP Vendor{ get; set; }
    IEnumerable<TC> ExecutionPeriods { get; set; }
}

Это продолжается еще на нескольких уровнях, и все прекрасно скомпилируется.

Проблема возникает, когда я пытаюсь реализовать это в сервисе.

public class FirstVendor : IVendor<FirstVendorAccount>
{
    public string Name { get; set; }
    public IEnumerable<FirstVendorAccount> Accounts { get; set;}
}

public class FirstVendorAccount : IAccount<FirstVendor, FirstVendorExecutionPeriod>
{
    public FirstVendor Vendor { get; set; }
    public string Name { get; set; }
    public IEnumerable<FirstVendorExecutionPeriod> ExecutionPeriods { get; set; }
}

Я получаю сообщение об ошибке компилятора, что у IVendor, IAccount и т. Д. Нет параметров типа. Что особенно странно, потому что, когда я попросил его реализовать интерфейс, он включал всех членов обоих соответствующих интерфейсов.

1 Ответ

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

Похоже, у вас есть циклическая ссылка - FirstVendorAccount необходимо знать о FirstVendor, прежде чем он сможет скомпилироваться, и наоборот.

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

Например:

public interface IVendor
{
    string Name { get; set; }    
}

public interface IVendor<TC> : IVendor where TC : IAccount
{
    IEnumerable<TC> Accounts { get; set; }
}

public interface IAccount
{
    string Name { get; set; }
}

// no longer needs IVendor<TC> before it can be compiled
public interface IAccount<TC> : IAccount where TC : IExecutionPeriod
{
    IVendor Vendor{ get; set; }
    IEnumerable<TC> ExecutionPeriods { get; set; }
}

Стоит посмотреть, действительно ли вам нужна общая типография - вам может быть лучше с небазовые базовые интерфейсы, так как с ними будет намного проще кодировать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...