Какую сборку я хочу? - PullRequest
       10

Какую сборку я хочу?

1 голос
/ 02 января 2011

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

Итак, я смотрю на Assembly.Get___Assembly. Я хочу использовать Calling, Entry или Executing? Эта веб-структура будет скомпилирована в свою собственную сборку DLL, и тогда люди, использующие инфраструктуру, должны включить эту библиотеку DLL и реализовать свои собственные классы, используя атрибуты из сборки веб-платформы.

Итак ... Я думал, что выполнение даст мне библиотеку веб-фреймворка, потому что именно там находится код обработки атрибутов, но не там, где используются атрибуты, так что это не то, что я хочу.

EntryAssembly звучит многообещающе ... но это работает через IIS .... так что бы он вернул?

И CallingAssembly просто звучит неправильно ... так что я хочу?


В настоящее время я еще не разделил веб-фреймворк на его собственную сборку, поэтому я как бы собираю веб-приложение и веб-фреймворк одновременно в одной сборке.

Так что ExecutingAssembly работает (на данный момент), но я боюсь, что когда я отделю его, это даст мне неправильный.

CallingAssembly дает System.Web, а EntryAssembly равно нулю по любой причине.

Ответы [ 3 ]

2 голосов
/ 02 января 2011

Если все элементы, украшенные этим атрибутом, находятся в той же сборке, что и вызывающий код, вы можете просто использовать this.GetType().Assembly (или typeof(CurrentType).Assembly для статики).

Другим распространенным сценарием является получение всех элементов приложения с атрибутом, независимо от сборки, что легко сделать с помощью AppDomain.CurrentDomain.GetAssemblies().

1 голос
/ 02 января 2011

Я думаю, что самый безопасный вариант здесь - позволить пользователям вашей платформы указать сборку, которую они хотят:

SomeClass.RegisterAssembly(this.GetType().Assembly);

(где SomeClass определено в вашей структуре)

0 голосов
/ 02 января 2011

Вот код, который я использовал для получения всех своих атрибутов:

* надрез *

Новая версия:

private static IEnumerable<Route> GetInlineRoutes()
{
    var methods = AppDomain.CurrentDomain.GetAssemblies()
        .SelectMany(a =>
            a.GetTypes()
                .Where(t => t.IsClass && t.IsSubclassOf(typeof (Controller))))
        .SelectMany(c => c.GetMethods(BindingFlags.Public | BindingFlags.Instance));

    return from method in methods
        let urlAttributes = method.GetCustomAttributes(true).OfType<UrlAttribute>()
        from attr in urlAttributes
        select new Route(attr.Pattern, method, attr.Priority);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...