2013-03-11 5 views
8

Tworzę system wtyczek dla mojej aplikacji i chciałbym, aby wtyczki odsłoniły ludzką czytelną nazwę. Aplikacja wyświetli listę dostępnych wtyczek, na tej liście nazwa musi być dostępna.Nadanie klasy wtyczek po ludzku czytelnej nazwie

Chcę, aby programiści wtyczek zrozumieli, co muszą zrobić, aby ich wtyczki działały.

Obecnie robię klasy wtyczek implementując interfejs, a interfejs wymaga implementacji właściwości "ConsumerName". Wymaga to jednak głównej aplikacji do utworzenia instancji każdej wtyczki, aby użyć właściwości CunsumerName, aby wyświetlić listę.

public interface IDataConsumer : IDisposable 
{ 
    string ConsumerName { get; } 

    void Consume(DataRowSet rows); 

    ... 
} 

Czy istnieje sposób zmuszenia klas wtyczek do dostarczania metadanych bez tworzenia instancji każdego typu?

Mój plan awaryjny polega na użyciu refleksji i niektórych atrybutów na każdej klasie, ale nie sądzę, że Atrybuty mogą być wymuszone za pomocą interfejsów.

+0

Powinieneś przeczytać nazwę wtyczki z pliku konfiguracyjnego, który pojawiłby się wraz ze wspomnianą wtyczką. – Guillaume

Odpowiedz

4

Nie, atrybuty nie mogą stanowić części umowy dotyczącej interfejsu. Ale mogą być wysoce zalecane.

Co robiłem w przeszłości jest atrybut takich jak:

[AttributeUsage(AttributeTargets.Class)] 
public class PluginNameAttribute : Attribute { 
    public string ConsumerName { get; set; } 
} 

Jeśli programista zdecyduje się urządzić swoją klasę z tego atrybutu, a następnie wielki. Jeśli nie, można spaść z powrotem na samą nazwę klasy:

var consumerName = type.Name; 
var nameAttribute = type.GetCustomAttributes(typeof(PluginNameAttribute), true) 
    .FirstOrDefault() as PluginNameAttribute; 
if (nameAttribute != null) { 
    var attributeName = nameAttribute.ConsumerName; 
    if (!string.IsNullOrEmpty(attributeName)) { 
     consumerName = attributeName; 
    } 
} 

To nie powinno być zbyt wiele, aby poprosić o plugin deweloperom użyć atrybutu jeśli jest to udokumentowane, że powinny to zrobić.

+0

Ładne i proste. Jaki byłby dobry sposób na wykrycie samej klasy atrybutów przez twórców wtyczek? –

+0

@PeterHenell - jak powiedział Jon, zawsze można rzucić wyjątek, jeśli klasa wtyczki nie jest ozdobiona atrybutem. W ten sposób, po raz pierwszy programista przetestuje swoją wtyczkę, natychmiast zorientuje się, że jest to wymagane. Jeśli brzmi to zbyt ekstremalnie, to dobra dokumentacja jest prawdopodobnie odpowiedzią. – ken

+0

Wyrzucenie wyjątku jest prawdopodobnie tym, co zrobię na końcu lub posiadam jakieś okno debugowania w aplikacji, które pokaże tego rodzaju informacje. –

3

Normalnie powiem "nie, nie ma". Dzieje się tak dlatego, że istnieją dwa mechanizmy umożliwiające wyciąganie informacji z typów bez potrzeby tworzenia instancji: static członków i atrybutów. Ponieważ nie ma nakładania się tych mechanizmów i interfejsów, nie można spełnić wszystkich podanych wymagań w tym samym czasie.

Co jednak jest nie tak z rozwiązaniem opartym na atrybutach? Z pewnością nie można wymusić obecności atrybutu pod groźbą nieudanej kompilacji, ale można to zrobić podczas ładowania wtyczki (lub nawet wcześniej).