Итак, у меня есть этот класс
public static class MyClass
{
static MyClass()
{
...
}
}
, который не имеет методов, полей или свойств.Все, что он делает - подключает обработчики к статическим событиям, определенным в другом месте.
Поскольку инициализатор типа никогда не вызывается, поскольку к статическому классу никогда не осуществляется доступ, события не подключаются.
Так что я надеялся, что смогу вызвать инициализатор типа через отражение ala typeof(MyClass).TypeInitializer().Invoke(...)
, которое взрывается, за исключением того, что MyClass
является абстрактным классом.
В конце концов приложение будет иметь другие статические классыс тем же форматом, который соответствует бизнес-правилам.Перед сохранением чего-либо в БД запускаются статические события, соответствующие типу сохраняемого объекта.Поэтому, если то, что я хочу сделать, окажется невозможным, любые рекомендации по рефакторингу должны следовать этой структуре.
РЕДАКТИРОВАТЬ:
Возможно, я не совсем понял, что именно япытаюсь сделать.В основном у меня есть слой данных, где вы можете инициализировать экземпляр DataContext
, а затем, когда вызывается SubmitChanges()
, я проверяю ChangeSet
на наличие вставок / обновлений / удалений и инициирую статические события для каждого вставляемого типа/ обновлено / удалено.Все это прекрасно работает, я просто ищу способ подключить обработчики к событиям, когда приложение запускается.Так что я играл с этим:
static DataContext()
{
System.Reflection.Assembly.GetExecutingAssembly().GetTypes()
.Where(t => t.Namespace == 'Data.Business')
.ToList()
.ForEach( t => {
// invoke the static TypeInitializer here,
// so that it can wire up it's event handlers.
});
}
Я мог бы использовать статический метод Initialize
, но, поскольку они должны быть инициализированы только один раз, я подумал TypeInitializer
.
РЕДАКТИРОВАТЬ 2:
Я прочитал MEF , и это действительно дает способ сделать то, что я хотел сделать.