teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

コード修正

2021/03/12 10:33

投稿

BluOxy
BluOxy

スコア2663

answer CHANGED
@@ -4,9 +4,9 @@
4
4
 
5
5
  という目的は解決できるので回答します。
6
6
 
7
- 下記コードの内、WantFunctionが注入される側のオブジェクトで、ProgramクラスのMainメソッドがオブジェクト(InjectionだったりDirectory.Existsだったり)を注入しています。
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> inject = dir => Injection.DirectoryExists();
21
+ Func<string,bool> f = dir => Injection.DirectoryExists();
22
22
  #else
23
- Func<string,bool> inject = dir => Directory.Exists(dir);
23
+ Func<string,bool> f = dir => Directory.Exists(dir);
24
24
  #endif
25
- var injected = new WantFunction<string,bool>(inject);
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<T1,T2>
31
+ public class WantFunction<T,TResult>
32
32
  {
33
- private readonly Func<T1,T2> _func;
33
+ private readonly Func<T,TResult> _func;
34
- public WantFunction(Func<T1, T2> func)
34
+ public WantFunction(Func<T, TResult> func)
35
35
  {
36
36
  _func = func;
37
37
  }
38
38
 
39
- public T2 CallInjectedFunction(T1 t)
39
+ public TResult CallInjectedFunction(T t)
40
40
  {
41
41
  return _func(t);
42
42
  }

2

bug

2021/03/12 10:33

投稿

BluOxy
BluOxy

スコア2663

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

文章の修正(学習コストがあるので、簡単かどうか言われるとちょっと怪しい気がしてきた)

2021/03/12 09:59

投稿

BluOxy
BluOxy

スコア2663

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コンテナ と呼ばれるフレームワークを触っみると良かもしれません