понедельник, 8 апреля 2019 г.

Очистка Git-репозитория

Хочу поделиться скриптом для Git, который помогает очищать репозиторий от файлов, не добавленных в контроль версий.

Назовем файл со скриптом clean.cmd.

Листинг файла clean.cmd


rem Removing untracked directories

git clean -f -d

rem Removing ignored directories

git clean -d -X -f

rem Removing ignored files

git clean -f -x

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

четверг, 4 ноября 2010 г.

Расширение класса string

Часто экземпляры класса string приходиться проверять на пустоту или null используя метод IsNullOrEmpty().

Или, например, такой код:

public void Foo(string value) {
        if (string.IsNullOrEmpty(value))
                throw new ArgumentNullException();

        // Проверка для строк состоящих из пробельных символов
        if (string.IsNullOrEmpty(value.Trim()))
                throw new ArgumentNullException();
        // ...
}

Однако такую проверку можно заменить на вызов метода экземпляра класса string.

public static class StringExtensions {
        public static bool IsNullOrEmpty(this string value) {
                return string.IsNullOrEmpty(value);
        }

        public static bool IsNullOrEmptySpace(this string value) {
                return value.IsNullOrEmpty() || value.Trim().IsNullOrEmpty();
        }
}

Теперь экземпляры класса string будут содержать в своем интерфейсе два дополнительных метода.

Однако возникает вопрос, что будет, если мы напишем так:

string value = null;
value.IsNullOrEmpty();

Оказывается метод вернет true. Хотя, например, такой код:

string value = null;
var length = value.Length;

вызовет исключение NullReferenceException.

Поэтому расширения можно использовать для любых экземпляров класса string.

Единственный недостаток такого подхода: необходимо везде подлючать пространство имен в котором находиться класс StringExtensions.

Метод Foo(string value) преобразуется в:

public void Foo(string value) {
        if (value.IsNullOrEmptySpace(value))
                throw new ArgumentNullException();
        // ...
}

суббота, 31 июля 2010 г.

Тестирование IoC контейнера Ninject 2.0

     Я недавно стал пользоваться Ninject 2.0 для создания IoC контейнеров. Это очень удобный фреймворк, однако ошибки при его конфигурации можно заметить только во время работы программы. Однако даже если IoC контейнер сконфигурирован не правильно, программа во многих случаях будет выполняться успешно. Было бы неплохо использовать модульные тесты для проверки IoC контейнера.

     Для тестирования своего ServiceModule я написал специальный класс-helper IoCTester, который проходит по классам всей сборки и пробует их инициализировать. При ошибке мой модульный тест падает.

Исходный код: NinjectTestingSample.zip

вторник, 20 июля 2010 г.

Отношение многие ко многим.

Рассмотрим два класса: Author и Book. Автор может хранить несколько книг. Книга тоже может иметь несколько авторов.

Сущности:

public class Author {
     public virtual int AuthorId { get; protected set; }
     public virtual IEnumerable Books { get; protected set; }
}

public class Book {
     public virtual int BookId { get; protected set; }
     public virtual IEnumerable Authors { get; protected set; }
}

Маппинг:

public sealed class AuthorMap : ClassMap<Author> {
     public AuthorMap() {
          Id(x => x.AuthorId);
          HasManyToMany(x => x.Books)
               .ChildKeyColumn("BookId")
               .ParentKeyColumn("AuthorId")
               .Table("Book_To_Author");
     }
}

public sealed class BookMap : ClassMap<Book> {
     public BookMap() {
          Id(x => x.BookId);
          HasManyToMany(x => x.Authors)
               .ChildKeyColumn("AuthorId")
               .ParentKeyColumn("BookId")
               .Table("Book_To_Author");
     }
}


Исходный код:
HasManyToManySample.zip


Fluent NHibernate для SQLite

понедельник, 19 июля 2010 г.

Отношение один к одному.

Для реализации отношения один к одному можно использовать метод References.

Сущности:

public class Author {
     public virtual int AuthorId { get; private set; }
     public virtual Book Book { get; private set; }
}

public class Book {
     public virtual int BookId { get; private set; }
}

Маппинг:

public sealed class AuthorMap : ClassMap<Author> {
     public AuthorMap() {
          Id(x => x.AuthorId);
          References(x => x.Book)
               .Column("BookId");
     }
}

public sealed class BookMap : ClassMap<Book> {
     public BookMap() {
          Id(x => x.BookId);
     }
}

Исходный код:
OneToOneSample.zip


Fluent NHibernate для SQLite

воскресенье, 18 июля 2010 г.

Отношение один ко многим.

Рассмотрим два класса: Author и Book. Автор может хранить несколько книг.

Сущности:

public class Author {
     public virtual int AuthorId { get; protected set; }
     public virtual IEnumerable Books { get; protected set; }
}

public class Book {
     public virtual int BookId { get; protected set; }
}

Маппинг:

public sealed class AuthorMap : ClassMap<Author> {
     public AuthorMap() {
          Id(x => x.AuthorId);
          HasMany(x => x.Books)
               .KeyColumn("AuthorId");
     }
}

public sealed class BookMap : ClassMap<Book> {
     public BookMap() {
          Id(x => x.BookId);
     }
}

Исходный код:
ManyToOneSample.zip


Fluent NHibernate для SQLite

среда, 14 июля 2010 г.

Fluent NHibernate для SQLite

Привет.
Недавно начал использовать Fluent NHibernate (http://fluentnhibernate.org) для быстрого создания маппингов. Сейчас хочу поделиться своим опытом и простыми примерами для SQLite. К сожалению Fluent NHibernate очень капризен и при любой ошибке приложение может упасть с ошибкой.

Отношение один ко многим.

Отношение один к одному.

Отношение многие ко многим.