Есть несколько наследников Window, включая MainWindow.
В App решается какой из Window надо открыть. Но перед этим должны быть созданы все зависимости, необходимые в MainWindow. Некоторые из зависимостей должны создаваться в App при каждом запросе. Например, если в MainWindow требуется реализация IFoo, то при каждом запросе в App надо создавать новый объект.
Как можно определить зависимости в App и как их передать в MainWindow? И при этом надо использовать только то, что есть в WPF, т.е. без подключения каких-либо сборок с IoC и т.д.
Asked
Active
Viewed 122 times
1
Stack
- 9,452
1 Answers
1
В такой ситуации можно использовать ресурсы App.
Например, есть интерфейс IFoo и его реализация определяется в App. Если надо создавать каждый раз новый объект, то в ресурсы можно поместить Func<IFoo>.
Model.cs
interface IFoo {
void Hello();
}
delegate void Log(string str);
App.xaml.cs
public partial class App : Application {
class Foo : IFoo {
public void Hello() { Console.WriteLine("hello"); }
}
public App() {
// объект создается по запросу
this.Resources.Add(typeof(IFoo), new Func<IFoo>(() => new Foo()));
// 'ссылка' на метод Trace
this.Resources.Add(typeof(Log), new Log(Trace));
}
void Trace(string str) {
Console.WriteLine(DateTime.Now + " " + str);
}
}
MainWindow.xaml.cs
partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
var f = this.Get<IFoo>(); // получить реализацию IFoo
f.Hello();
var log = this.Get<Log>(); // получить 'ссылку' на метод
log("test");
}
}
static class WindowExtensions {
static public T Get<T>(this Window w) {
var o = w.FindResource(typeof(T));
return (o.GetType() == typeof(Func<T>))
? ((Func<T>)o)()
: (T)o;
}
}
Результат
hello
1/5/2016 1:54:11 PM test
Stack
- 9,452