nosu blog

Web界隈からエンタープライズITに転身したときのメモとか

UnityやAutofacでDIする際に、同じ型の複数のインスタンスを注入する方法

.NETで開発をしていると、クラスを別の依存クラスの実装と分離するために、Dependency Injection(DI)を使うことは多い。 その際に、一種類の依存するインタフェースにつき、一つだけインスタンスを渡せば良いのであれば話は単純なのだが、一つのインタフェースでも、コンストラクタの異なる複数のインスタンスを渡したい、というようなケースがある。

例えば、以下のようなケースである。

  • IHttpClient (実装は HttpClient) という、何らかのHTTPリクエストを送るためのクライアントがある
  • HttpClient はコンストラクタの引数としてHTTP接続の際のベースURLを受け取るとする。
  • このクライアントを利用する SampleController では、2つの異なるベースURLに接続する必要があるため、それぞれコンストラクタの異なる2つのHttpClientのインスタンスを利用したい

以下のやり方で、このような場合にも対応できる。

Unity を使っている場合

DIのライブラリにUnityを使っている場合、Unityの持つ名前付きでRegisterTypeする機能を使う。

var BaseUriA = "a.example.com"; // 1つ目のベースUri
var BaseUriB = "b.example.com"; // 2つ目のベースUri

var container = new UnityContainer();
container.RegisterType<IHttpClient, HttpClient>(
    "HttpClientA", // 一つ目の引数として任意の名前を渡す
    new InjectionConstructor(BaseUriA)
);
container.RegisterType<IHttpClient, HttpClient>(
    "HttpClientB",
    new InjectionConstructor(BaseUriB)
);

// 上でつけた名前を使って、2つのHttpClientをSampleControllerのコンストラクタに渡す
container.RegisterType<SampleController>(new InjectionFactory(c =>
    new SampleController(
        c.Resolve<IHttpClient>("HttpClientA"),
        c.Resolve<IHttpClient>("HttpClientB")
    )
));
public class SampleController : ApiController {
    private IHttpClient HttpClientA;
    private IHttpClient HttpClientB;

    public SampleController(IHttpClient HttpClientA, IHttpClient HttpClientB) {
        this.HttpClientA = HttpClientA;
        this.HttpClientB = HttpClientB;
    }

}

Autofac を使っている場合

Unityはもはやメンテされていないため、今後新しいプロジェクトでは利用しないことが望ましい。代替としてよく名前の上がるAutofacの場合、Named and Keyed Services という機能で目的の挙動が実現できる。 依存を受け取る側で、IIndex<K, V>という型で複数インスタンスを受け取り、名前を指定することで目的のインスタンスを取り出す。

var BaseUriA = "a.example.com"; # 1つ目のベースUri
var BaseUriB = "b.example.com"; # 2つ目のベースUri

var builder = new ContainerBuilder();
builder.RegisterType<HttpClient>()
    .WithParameter(new TypedParameter(typeof(string), BaseUriA))
    .Named<IHttpClient>("HttpClientA");
builder.RegisterType<HttpClient>()
    .WithParameter(new TypedParameter(typeof(string), BaseUriB))
    .Named<IHttpClient>("HttpClientB");
public class SampleController : ApiController {
    private IIndex<HttpClient, IHttpClient> httpClients;

    public SampleController(IIndex<HttpClient, IHttpClient> httpClients) {
        this.httpClients = httpClients;
    }

    public IHttpClient GetClientA() {
        return httpClients["HttpClientA"];
    }
}

参考

.NET 関連の製品名 (.NET Core, ASP.NET, .NET Framework...) を整理する

.NET 関連の勉強をするにあたり、まずは基本の基本からということで、.NET 系の製品名を整理する。馴染みのない人間からすると、似たような名前が多く、非常にまぎらわしい。Web記事などを参考にしているので、誤った理解があるかもしれないが、気づいたら適宜修正するということで、取り急ぎメモ。

参考

エディタのVimモードで、Escキーを押したときに日本語入力をオフにする設定(macOS, Windowsそれぞれの場合)

VimgVim、あるいはAtomやVS Codeなどの、Vimバインドモードを利用できるエディタで日本語を扱う際に、問題となるのが日本語入力モードの切り替えだ。デフォルトだと、日本語入力モードでEscやCtrl+[を押してノーマルモードに抜けた際に、日本語入力状態のままとなってしまい、コマンド操作ができなくなってしまう。

そこで、

  • Vim、またはAtomやらVS CodeやらVisual StudioなどのVimバインドモードを利用できるエディタを使っている際には
  • EscまたはCtrl+[を押下した際に
  • 日本語入力をOFFにする

ように設定を行う。

続きを読む

地味に便利なmkpasswdでランダムパスワードを生成する

いろいろな条件でパスワード生成できるmkpasswdコマンドが地味に便利。 CentOSの場合デフォルトでは入っていないので、下記にてインストールする。

$ sudo yum install expect

オプションにて、文字数や記号・数字の数を指定できる。

オプション 意味
-l 数字 パスワードの長さを指定(デフォルトは9)
-d 数字 パスワードに含める数字の数を指定(デフォルトは2)
-c 数字 パスワードに含めるアルファベット(小文字)の数を指定(デフォルトは2)
-C 数字 パスワードに含めるアルファベット(大文字)の数を指定(デフォルトは2)
-s 数字 パスワードに含める特殊文字(記号など)の数を指定(デフォルトは1)
-2 パスワードが、右手と左手で交互に入力される文字配列となる(QWERTYキーボードの場合)

個人的によく使うのは、下記の「8文字・数字2桁・記号なし」。

$ mkpasswd -l 8 -d 2 -s 0

参考

任意の文字数でパスワードをランダム生成するには - @IT

特定のスポットを指定してAndroid版GoogleMapsアプリを開くURLスキーマ

特定のGoogle Placesのスポットにピンを立てた状態でGoogle Mapsを開きたい場合、下記のように指定する。

geo:<lat>,<long>?q=<lat>,<long>(Label+Name)

LabelとNameに指定したテキストは、Google Maps上で「[Label](スペース)[NAME]」と続けて表示される。

参考

Windows7で多少はましなターミナル環境を作る

仕事でリモートにつないで作業するとき、TeraTerm + LogMeTTを使っていたんですが、

  • ローカルでもシェル使えたら便利そう
  • リモートホストをLogMeTTで管理するのがめんどい。.ssh/configへ書く方が楽

といった理由で、cygwinを導入することにした。本当はローカルのVMCentOSとか使おうと思ったんだけど重いので断念。 最適解なのかはわかりませんが、以前よりは結構快適になったのでメモ。

目次

  1. cygwinをインストール
  2. apt-cygを導入
  3. zshをインストール
  4. Kaoriya版Vimをインストール
  5. screen(byobu)をインストール
  6. ドットファイルをインポート
  7. SSHの各種設定
続きを読む