12

これが可能かどうかわからない。

列挙値に基づいてサービスの正しい実装を返す必要があります。したがって、手作業でコーディングされた実装は次のようになります。

public enum MyEnum
{
  One,
  Two
}    

public class MyFactory
{
  public ITypeIWantToCreate Create(MyEnum type)
  {
    switch (type)
    {
       case MyEnum.One
           return new TypeIWantToCreate1();
           break;
       case MyEnum.Two
           return new TypeIWantToCreate2();
           break;
       default:
           return null;       
    }    
  }
}

返される実装には追加の依存関係があり、コンテナーを介して注入する必要があるため、手動でロールされたファクトリは機能しません。

これは可能ですか?もしそうなら、登録はどのようになりますか?

4

2 に答える 2

8

コンポーネントIDとして列挙値を指定するコンテナにコンポーネントを登録することがオプションである場合は、このアプローチも検討できます。

 public class ByIdTypedFactoryComponentSelector : DefaultTypedFactoryComponentSelector
 {
      protected override string GetComponentName(MethodInfo method, object[] arguments)
      {
            if (method.Name == "GetById" && arguments.Length > 0 && arguments[0] is YourEnum)
            {
                 return (string)arguments[0].ToString();
            }

            return base.GetComponentName(method, arguments);
      }
}

ByIdTypedFactoryComponentSelectorは、型付きファクトリのセレクターとして使用されます。

public enum YourEnum
{
    Option1
}

public IYourTypedFactory
{
    IYourTyped GetById(YourEnum enumValue)
}


container.AddFacility<TypedFactoryFacility>();
container.Register
(       
    Component.For<ByIdTypedFactoryComponentSelector>(),

    Component.For<IYourTyped>().ImplementedBy<FooYourTyped>().Named(YourEnum.Option1.ToString()),

    Component.For<IYourTypedFactory>()
    .AsFactory(x => x.SelectedWith<ByIdTypedFactoryComponentSelector>())
    .LifeStyle.Singleton,

    ...
于 2012-10-04T09:45:25.073 に答える
1

これは可能のようです。これを見てください:

呼び出しを解決するためにITypedFactoryComponentSelector実装を作成し、それをコンテナーに登録して、関心のあるクラスの呼び出しのみを解決する必要があります。

于 2012-10-03T15:49:54.527 に答える