Ну, это было некоторое время, извините за это!
Мне удалось создать общий метод. Вместо этого для каждого объекта:
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.
Общий способ, безусловно, имеет свои недостатки, так как он по меньшей мере в 20-30 раз медленнее, чем прямой. Так что это зависит от производительности и вашего личного вкуса, что реализовать ... –