Я наткнулся на тот же подход, но когда таблица стала больше (core_challenges_table в вашем сценарии), whereHas
оказалась очень медленной (около 1 минуты времени отклика).
Поэтому я использовал решение, подобное этому:
$ids = CoreChallenge::where('status', 'active')->pluck('id');
$challenges = Challenge::with('core_challenges')
->whereIn('core_challenge_id', $ids)
->get();
При таком подходе мой запрос сократился до 600 мс с 1 минуты.
Который может быть переведен в модельные рамки
class Challenge {
public function scopeActive($query) {
$activeIds = CoreChallenge::where('status', 'active')->pluck('id');
return $query->whereIn('core_challenge_id', $ids);
}
}
Challenge::with('core_challenges')->active()->get();
Фил Хаак только что опубликовал сообщение в блоге несколько дней назад, которое, вероятно, поможет вам; Он использует базу данных для хранения представлений и ruby для их обработки, но я думаю, вы могли бы взять его прототип и заставить его работать для представлений, хранящихся в отдельной сборке, довольно легко.
Просто быстрый взгляд на код, и я думаю, Волшебный соус будет реализовывать VirtualPathProviderViewEngine (см., например, класс "RubyViewEngine") и вставлять ваш ViewEngine в коллекцию ViewEngines.Engines (см. Global.asax.cs).
Тип WebFormView в конечном счете называет BuildManager. CreateInstanceFromVirtualPath. Нет перегрузки или другой функции в BuildManager для взятия входа от потока вместо от виртуального тракта. Поэтому, если Вы не захотите реализовывать IView сами, то необходимо будет на самом деле распаковать файлы к диску так, чтобы они могли быть скомпилированы BuildManager. Вы могли все еще распределить свой DLL как единственный файл, но aspx файлы должны быть произведены для BuildManager для компиляции их. Посмотрите справку BuildManager для деталей.
Познакомьтесь с codeplex и взгляните на Управляемую платформу расширяемости
Как только вы это сделаете ...
Посмотрите, что Мартен Баллиау должен сказать о ASP.NET MVC и инфраструктуре управляемой расширяемости (MEF)
ПРИМЕЧАНИЕ. Это решение работает только при нацеливании на платформы .NET 2.0 (и более новые).
using System;
using System.Net;
using System.Net.NetworkInformation;
//...
public static string GetFQDN()
{
string domainName = IPGlobalProperties.GetIPGlobalProperties().DomainName;
string hostName = Dns.GetHostName();
domainName = "." + domainName;
if(!hostName.EndsWith(domainName)) // if hostname does not already include domain name
{
hostName += domainName; // add the domain name part
}
return hostName; // return the fully qualified name
}
ОБНОВЛЕНИЕ
Поскольку многие люди отметили, что Ответ Сэма ] является более кратким, я решил добавить некоторые комментарии к ответу.
Самое важное отметить, что код, который я дал, не эквивалентен следующему коду:
Dns.GetHostEntry("LocalHost").HostName
Хотя в В общем случае, когда компьютер подключен к сети и является частью домена, оба метода обычно дают одинаковый результат, в других сценариях результаты будут отличаться.
Сценарий, в котором выходные данные будут отличаться, - это когда компьютер не является частью домен. В этом случае Dns.GetHostEntry ("LocalHost"). HostName
вернет localhost
, в то время как приведенный выше метод GetFQDN ()
вернет NETBIOS-имя хоста.
Это различие важно, когда цель поиска полного доменного имени машины это для регистрации информации или создания отчета. Большую часть времени я использовал этот метод в журналах или отчетах, которые впоследствии используются для сопоставления информации с определенной машиной. Если машины не подключены к сети, идентификатор localhost
бесполезен, тогда как имя дает необходимую информацию.
Таким образом, в конечном счете, каждый пользователь должен выбрать, какой метод лучше подходит для его применения, в зависимости от того, какой результат им нужно. Но сказать, что этот ответ неверен из-за недостаточной краткости, в лучшем случае поверхностно.
См. Пример, где вывод будет другим: http: // ideone.
Изучите ASP.NET MVC View Engine с помощью проекта VB.NET XML Literals на CodePlex http://vbmvc.codeplex.com
Первоначально это был пользовательский механизм просмотра Задуманный Дмитрием Робсманом, который является PUM для ASP.NET в Microsoft. Каждое представление является классом VB.NET, а пространство имен (вместо пути к файлу) используется для подключения представлений к контроллерам. Довольно просто скопировать содержимое ваших файлов представления ASPX в литералы XML в этих классах VB. И как классы, они компилируются в сборку без каких-либо дополнительных усилий.
Если ваши контроллеры являются C #, то, скорее всего, у вас получится 2 DLL, но у Скотта Хансельмана есть запись в блоге о том, как заставить C # и VB работать. вместе в одной сборке. http://www.hanselman.com/blog/MixingLanguagesInASingleAssemblyInVisualStudioSeamlesslyWithILMergeAndMSBuild. aspx