回答編集履歴
3
コード修正
answer
CHANGED
@@ -4,9 +4,9 @@
|
|
4
4
|
|
5
5
|
という目的は解決できるので回答します。
|
6
6
|
|
7
|
-
下記コードの内、WantFunctionが注入される側のオブジェクトで、ProgramクラスのMainメソッドがオブジェクト
|
7
|
+
下記コードの内、WantFunctionが注入される側のオブジェクトで、ProgramクラスのMainメソッドが注入する側のオブジェクトで、そのメソッドの内、fというFuncオブジェクトが実際に注入するオブジェクトです。
|
8
8
|
|
9
|
-
今回の場合、DebugとReleaseを変え
|
9
|
+
今回の場合、DebugとReleaseを構成を変えることで、注入するオブジェクトを切り替えることができます。
|
10
10
|
(今回はifプリプロセッサを使って構成変更時に注入するオブジェクトを変更していますが、変更できれば手段は何でも構いません)
|
11
11
|
|
12
12
|
このDIを活用しても自作のスタブへ差し替えることができます。
|
@@ -18,25 +18,25 @@
|
|
18
18
|
{
|
19
19
|
#if DEBUG
|
20
20
|
//NOTE: ところで、パラメータがないのは意図通りでしょうか?
|
21
|
-
Func<string,bool>
|
21
|
+
Func<string,bool> f = dir => Injection.DirectoryExists();
|
22
22
|
#else
|
23
|
-
Func<string,bool>
|
23
|
+
Func<string,bool> f = dir => Directory.Exists(dir);
|
24
24
|
#endif
|
25
|
-
var injected = new WantFunction<string,bool>(
|
25
|
+
var injected = new WantFunction<string,bool>(f);
|
26
26
|
Console.WriteLine(injected.CallInjectedFunction("hoge"));
|
27
27
|
|
28
28
|
}
|
29
29
|
}
|
30
30
|
|
31
|
-
public class WantFunction<
|
31
|
+
public class WantFunction<T,TResult>
|
32
32
|
{
|
33
|
-
private readonly Func<
|
33
|
+
private readonly Func<T,TResult> _func;
|
34
|
-
public WantFunction(Func<
|
34
|
+
public WantFunction(Func<T, TResult> func)
|
35
35
|
{
|
36
36
|
_func = func;
|
37
37
|
}
|
38
38
|
|
39
|
-
public
|
39
|
+
public TResult CallInjectedFunction(T t)
|
40
40
|
{
|
41
41
|
return _func(t);
|
42
42
|
}
|
2
bug
answer
CHANGED
@@ -20,7 +20,7 @@
|
|
20
20
|
//NOTE: ところで、パラメータがないのは意図通りでしょうか?
|
21
21
|
Func<string,bool> inject = dir => Injection.DirectoryExists();
|
22
22
|
#else
|
23
|
-
Func<string,bool> inject = Directory.Exists(dir);
|
23
|
+
Func<string,bool> inject = dir => Directory.Exists(dir);
|
24
24
|
#endif
|
25
25
|
var injected = new WantFunction<string,bool>(inject);
|
26
26
|
Console.WriteLine(injected.CallInjectedFunction("hoge"));
|
1
文章の修正(学習コストがあるので、簡単かどうか言われるとちょっと怪しい気がしてきた)
answer
CHANGED
@@ -7,9 +7,9 @@
|
|
7
7
|
下記コードの内、WantFunctionが注入される側のオブジェクトで、ProgramクラスのMainメソッドがオブジェクト(Injectionだったり、Directory.Existsだったり)を注入しています。
|
8
8
|
|
9
9
|
今回の場合、DebugとReleaseを変えてビルドすることで、注入するオブジェクトを切り替えることができます。
|
10
|
-
(注入する
|
10
|
+
(今回はifプリプロセッサを使って構成変更時に注入するオブジェクトを変更していますが、変更できれば手段は何でも構いません)
|
11
11
|
|
12
|
-
このDIを活用して
|
12
|
+
このDIを活用しても自作のスタブへ差し替えることができます。
|
13
13
|
|
14
14
|
```C#
|
15
15
|
public class Program
|
@@ -53,4 +53,4 @@
|
|
53
53
|
```
|
54
54
|
|
55
55
|
DIに慣れてくると場合によっては注入するそれぞれのインスタンスの有効期間を変えたいことがあるように、より小回りが利くDIがしたいときもあるかもしれません。
|
56
|
-
そのときは DIコンテナ と呼ばれるフレームワーク
|
56
|
+
そのときは DIコンテナ と呼ばれるフレームワークを触ってみると良いかもしれません。
|