Забег на короткие дистанции.

Последние несколько дней напоминали забег на короткие дистанции. Пробежал 200 метров, упал, отдохнул, пробежал еще 200 метров. И так до полного истощения )))
Все это связано с тем, что последнии дни мне активно приходилось заниматься разработкой решений на платформе Microsoft Office SharePoint 2007(MOSS). По поводу этой платформы сказано было многое и много подходов к разработки решений. В ближайшее время я постараюсь описать свои ощущения, описать найденные нами решения и если получиться сделать, не большие, выводы из всего этого. )))

Trac+VisualStudio

Программист - человек ленивый. Звучит как новый вид. И все же.

Для ведения задач, в нашей команде используется продукт, под названием trac. Удобное средство для тех кто хочет работать по Agile методологиям. Основным интерфейсом является web. И для всех необходимых манипуляций необходимо заходить в броузер по адресу трека.
Если вернуться к первой фразе записи, то можно предположить, что закрыв задачу и приступ к другой, программисты как правило забывают отмечать где и что они сейчас делают. Ну лениво им зайти в броузер и сделать пару телодвижений. Голова гудит идеями и мыслями, а тут какой-то trac.

Trac, является бесплатной программой, и как любая бесплатная программа, к ней разработано огромное количество плагинов, макросов и дополнений.

Чисто случайно я наткнулся на вот этот замечательный плагин под названием VSTrac.
Который позволит иметь в студии вот такие панели.











(картинки кликаются)


Плагин совсем молодой всего 0.1 Beta3 версия. Но будущее у него я думаю не маленькое. К тому же сам Microsoft продвигает VS как среду разработки. И у Team Suite должна быть какая-то альтернатива.

Небольшая инструкция "Зачем нужен SVN"

В команде работают люди разного уровня. И многим приходится объяснять, что такое SVN и как он помогает. Каждый раз одно и тоже.
"Я разработчик 1, ты разработчик 2.
Мы вносим изменения, SVN помогает избежать бардака."

И так каждому второму )))
Теперь я нифига им не буду объяснять, я лучше дам наушники в руки и посажу перед монитором.

Смотри сюда новис

Старт дачного сезона 2008

Сошли снега. На дорогах нашей необъятной родины стали появляться пробки. Там где раньше можно было проехать за пол часа, теперь можно вообще не доехать. Это все дачники, это они потянулись к своим участкам, домикам, коттеджам и виллам. Потянуло на природу и меня ))



Кроме мозолей и усталости желательно привозит домой еще что-нибудь.


ASP.NET MVC Interim Released

Некоторое время назад я жаловался на реализацию паттерна Interception Filter в Asp Net Mvc. И вот вчера вышел очередной релиз это продукта.
Вот одно из изменений:
  • Action Filters now have four methods they can implement representing four possible interception points.
    • OnActionExecuting which occurs just before the action method is called.
    • OnActionExecuted which occurs after the action method is called, but before the result is executed (aka before the view is rendered in common scenarios).
    • OnResultExecuting which occurs just before the result is executed (aka before the view is rendered in common scenarios).
    • OnResultExecuted which occurs after the result is executed (aka after the view is rendered in common scenarios).

Сериализация анонимных объектов в dot.net-е

Если использовать стандартную сериализацию dotnet с помощью объекта DataContractJsonSerializer, то можно натолкнуться на определенный проблемы при сериализации анонимных типов. И именно с ними столкнулись мы.
Тоесть, что-то вроде этого не сработает.



public static string ToJSON(this object obj, List knowTypes)
{
DataContractJsonSerializer serializer;
if (knowTypes == null)
serializer = new DataContractJsonSerializer(obj.GetType());
else
serializer = new DataContractJsonSerializer(obj.GetType(), knowTypes);
using (MemoryStream ms = new MemoryStream())
{
serializer.WriteObject(ms, obj);
return Encoding.UTF8.GetString(ms.ToArray());
}
}

Недолго думаю открыл гугл и сделал запрос "anonymous types+serialize" на второй или на третей ссылке наткнулся на вот эту библиотеку. С давнольно мощными возможностями по сериализации в JSON формат.
Например вот так.


JArray a = JArray.FromObject(
new List
{
new {name="Первый пошел"},
new {name="Второй пошел", type = "Танк"},
new {name="Склад пошел", list = new List {
new {name="макароны"},
new {name="тарелки"}
}
}
}

a.ToString();

В результате получаем что-то вроде этого

[
{ "name": "Первый пошел"},
{ "name": "Второй пошел", "type":"Танк"},
{ "name": "Склад пошел", "list":
[
{"name" = "макароны"},
{"name" = "тарелки"}
]
}
]

Вот так.

Метание по блогам

Наконец-то закончил метания по блогам. Решился раз и на всегда остаться на blogspot. Во первых, имея акканут гугла это проще, во вторых настройки блога тут гибче.

Пляски во круг Controller, ViewData, ViewPage

Запутался в трех соснах. И видимо пока мелкософт не предложит свою реализацию subcontroller, так и придеться бродить между ними.

Задачка вроде бы простая.

Есть контроллер который как папа карло берет из бревна(Модели), данные. Обрабатывает их и передает во View.
И вот ту та наступает полный понедельник. Неужели каждый раз когда папе карло понадобиться один и тот же нос, у Буротины, он будет его строгать. Один и тот же нос, изо дня в день, ширк-ширк, ужас.

А теперь про сосны в которых я заблудился.
Можно действительно в каждом контроллере делать одну и туже постоянную работу. Например формировать информацию о пользователе. Это сосна раз.
Можно расширить ViewData, с помощью методов extension, и например формировать меню. Это сосна два. Причем со скрученным стволом, так как противоречит MVC.
Можно расширить ViewPage, с помощью тех же методов. Это сосна три. К тому же кроной перепуталась со второй сосной.
Все остальные варианты это метание между эти тремя соснами.

Есть еще один грамотный вариант, сделать subcontroller-ы самому. Но как то уже обожглись на этом. Когда сделали управляемое использование ViewEngine. Вышел новый CTP и на тебе там уже есть свойство ViewEngine которое позволяет менять View.

Концепция Interception Filter в AspNet Mvc

Существует паттерн, называемый InterceptionFilter. Коротко о его сути. Его задача, предоставить возможность фильтровать поток данных на входе в какой-то модуль и на выходе(Фильтры перехватчики, если дословно ) :).
После выхода бета версии Asp Net Mvc. Было внесено предложение о реализации этого паттерна и было даже предложено решение. И по многочисленным просьбам телезрителей команда разработчиков, занимающаяся разработкой AspNetMvc, включила в CTP, решение этого паттерна.
Ура сказали мы и многие разработчики. Салют мальчишам-кибальчишам из майкрософта.
Это при сказка, а теперь будет сказка.

И вот решили мы написать свой фильтр. Задача которого состояла в добавлении кое каких данных во ViewData и передача его во View. Радостно размахивая клавами мы быстренько написали этот фильтр который состоял из одного метода.

public override void OnActionExecuted(FilterExecutedContext filterContext)
{
IFilterViewData filterData = ((filterContext.Controller as Controller).ViewData['Filter'] as IFilterViewData);
filterData.IsActive = true;
}

Теперь не меннее радостно ждем эти данные во View. Ага, как же, дождались!
Не знаю о чем думали ТАМ. Но метод OnActionExecuted действительно исполняется после отработки метода-экшена.
Он исполняется даже после обработки View(RenderView).
Какой же это FilterController подумали мы и пошли курить бамбук. Это какой-то FilterMethod, а его мы вовсе на ждали.

Погуглив совсем немного наткнулись на предложение в форуме aspnet. Где просят сделать что-то вроде OnRenderView.

public ProductViewData : IEntityContainer
{
object IEntityContainer.Entity { get { return this.Product; } }

public Product Product { get; set; }
public List<string> OtherProperty { get; set; }
// etc.
}


public class MyFilterAttribute : ActionFilterAttribute
{
private string[] acceptedFormats = new string[]{"json", "xml"};

public override object OnRenderView(ViewContext viewContext)
{
string format = viewContext.HttpContext.Request["format"];

if( string.IsNullrEmpty( format ) )
return;

if( !acceptedFormats.Contains( format.ToLower() ) )
return;

if( viewContext.ViewData is IEntityContainer)
viewContext.ViewData = (viewContext.ViewData as IEntityContainer).Entity;
}
}

Задача осталось решения от разработчика нету.
Единственным выходом на данные момент это использовать стандартную ViewData, аля словарь.
Вносить изменения в OnExecutingAction и молится что в контроллере никто не перезаписал его и не использовал типизированную ViewData