2013-11-10 3 views
1

У меня есть куча объектов BLL, которые непосредственно сопоставлены сущностями из базы данных в первом сценарии модели. Я получаю theese объектов из DAL через BLL в слой представления через интерфейсы, как это (от слоя BLL):Получить объект из DAL через BLL в представлении через generics

public static ILanguage GetNewLanguage() 
    { 
     return new Language(); 
    } 


    public static bool SaveLanguage(ILanguage language) 
    { 
     return DAL.Repositories.LanguageRepository.Save(language); 
    } 

И в презентации слое я получаю объект просто этот вызов:

ILanguage language = BLL.Repository.GetNewLanguage();

Теперь, когда у меня есть куча объектов, я хотел бы сделать общие методы BLL, поэтому мне не нужно писать один и тот же код для каждого объекта.

Но я не уверен, как это сделать. Спасибо, спасибо.

/Финн.

ответ

0

Ну, это было некоторое время, извините за это!

Мне удалось создать общий метод. Вместо этого для каждого объекта:

public static ILanguage GetNewLanguage() 
    { 
     return new Language(); 
    } 

Я сейчас, используя этот универсальный метод (но я думаю, что это все еще неуклюжий способ сделать это):

public static T CreateNew<T>(out string errmsg) where T : class 
    { 
     errmsg = string.Empty; 

     // Loading the DAL assembly as you cannot allways be sure that it is loaded, 
     // as it can be used from the GAC and thereby not accessible as a loaded assembly. 
     AppDomain.CurrentDomain.Load("DAL"); 

     // From loaded assemblies get the DAL and get the specific class that implements 
     // the interface provided, <T>. 
     // It is assumed for the time being, that only one BLL dataobject implements the interface. 
     var type = AppDomain.CurrentDomain.GetAssemblies() 
      .SelectMany(s => s.GetTypes()) 
      .Where(p => typeof(T).IsAssignableFrom(p) && p.IsClass) 
      .FirstOrDefault(); 

     try 
     { 
      // Create an instance of the class that implements the interface in question, unwrap it 
      // and send it back as the interface type. 
      var s = Activator.CreateInstance("DAL", type.FullName); 
      return (T)s.Unwrap(); 
     } 
     catch (Exception ex) 
     { 
      errmsg = ex.ToString(); 
      return null; 
     } 

    } 

Звонок из презентации слоя выглядит например:

string errmsg = string.Empty; 
ILanguage language = BLL.CreateNew<ILanguage>(out errmsg); 

Я решил очевидную проблему, но все же не причудливо. У меня есть идея использовать DI для развязки сборок друг от друга, но я не уверен, как это сделать. Комментарии очень хорошие. И я отключаю решение в новом потоке, если найду его.

А также я опубликую решение идеи Круда о том, как отделить BLL от DAL с классом репозитория, в новом потоке, когда я это понял!

Cheers Finn.

+0

Общий способ, безусловно, имеет свои недостатки, так как он по меньшей мере в 20-30 раз медленнее, чем прямой. Так что это зависит от производительности и вашего личного вкуса, что реализовать ... –

0

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

Here

+0

Roger, Crud! Спасибо за ваш взгляд, я буду ближе к нему, когда я решаю основное ядро ​​в вопросе, а именно, как установить класс, реализующий определенный интерфейс, а затем вернуть его обратно. Возможно, я нахожусь на пути к DI, но пока что я в AppDomain.CurrentDomain.GetAssemblies() и Activator.CreateInstance. Я скоро отправлю решение. Извините за поздний комментарий. Cheers ... –

Смежные вопросы