2010-05-14 2 views
1

У меня есть следующий абстрактный класс, мне было интересно, могут ли кто-нибудь предложить какие-либо улучшения в плане более строгого соблюдения наших требований или упрощения внедрения ControllerBase.Улучшить этот общий абстрактный класс

//Dependency Provider base 
public abstract class ControllerBase<TContract, TType> where TType : TContract, class 
{ 
    public static TContract Instance 
    { 
     get { 
    return ComponentFactory.GetComponent<TContract, TType>(); 
      } 
    } 

public TContract GetComponent<TContract, TType>() where TType : TContract, class 
{ 
     component = (TType)Activator.CreateInstance(typeof(TType), true); 
     RegisterComponentInstance<TContract>(component); 
} 
} 

//Contract 
public interface IController 
{ 
void DoThing(); 
} 

//Actual Class Logic 
public class Controller: ControllerBase<IController,Controller> 
{ 
public void DoThing(); 

    //internal constructor 
    internal Controller(){} 

} 


//Usage 
public static void Main() 
{ 
Controller.Instance.DoThing(); 
} 

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

  • TType всегда должны осуществлять TContract (Форсированная с помощью общего ограничения)

  • TContract должен быть интерфейс (не может найти способ обеспечения соблюдения)

  • TType не должен иметь публичный конструктор, только внутренний, есть ли способ Использовать, используя ControllerBase?

  • TType должен быть в конкретный класс (Не включать New() в качестве родового стеснять, так как конструкторы должны быть помечены как Internal)

+1

Применение TContract, являющегося интерфейсом, кажется бессмысленным. Не поймите меня неправильно, но интерфейсы не могут быть созданы. Понимать их как простые контракты, не более того, они применяют (в основном) только поведение. Но они не типы, ни классы. Вы должны попытаться объяснить, почему вы хотите, чтобы он был интерфейсом. –

+0

Извините, я не знаю, почему я сказал интерфейс, я имел в виду абстрактный класс –

+0

Не могли бы вы объяснить, почему это не сработает? –

ответ

0

Существует способ для обеспечения TType быть конкретным классом и одновременно запрещает успех конструктора. Я предполагаю, что можно попытаться создать экземпляр TType, который будет успешным, только если это конкретный тип, однако вы хотите избежать создания экземпляра. Я бы предложил попробовать исключить из конструктора исключение. В базе вашего контроллера вы можете объединить экземпляр с кодом обработки исключений. Это произойдет через время компиляции, только если вы создадите конкретный тип, и он пройдет через время выполнения, если вы выбросите исключение ... Это общая плохая практика (если возможно), и я думаю, вам нужен совершенно другой дизайн для достижения того, что вы ищете ,

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