2010-07-29 5 views
2

У меня есть базовая 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 и т. Д. Не имеют параметров типа. Что особенно странно, потому что, когда я попросил его реализовать интерфейс, он включал всех членов из обоих соответствующих интерфейсов.

+0

Я почти не хочу этого говорить, но пример кода пахнет очень плохо. Я настоятельно рекомендую вам, ребята, переосмыслить этот подход, поскольку он кажется чрезмерно сложным для вашей заявленной цели. – NotMe

ответ

1

Похоже, что у вас есть круглые ссылки - 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; } 
} 

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

Смежные вопросы