2010-12-03 6 views
6
ここ

私が今持っているものユニティアプリケーションブロック、パラメータをどのように注入工場に渡しますか?

Container.RegisterType<IUserManager, UserManagerMock>(); 
    Container.RegisterType<IUser, UserMock>(
       new InjectionFactory(
        (c) => c.Resolve<IUserManager>().GetUser("John"))); 

し、それを

Container.Resolve<IProfile>(); 

を取得し、私は名前を持つユーザーオブジェクトを解決することができるようになりますように、工場出荷時にパラメータとして名前を渡したいです。このような 何か:

Container.Resolve<IProfile>("Jonh"); 

がどのように私はこの場合のタイプ登録を変更できますか?

+0

個人的には、IUser/IProfileをサービスロケーション経由で取得しようとはしません。サービスの場所でIUserManagerを取得し、コード内でGetUser( "John")を呼び出すだけでOKです。 –

+0

私はジョンに同意します。可能であれば、サービスの場所の代わりに依存関係注入を使用してください。これにより、コードをコンテナへの呼び出しから解放し、アプリケーション内でコンテナを呼び出す場所を1つ(または多くてもいくつか)持つことができます。 – Steven

答えて

7

最もDIフレームワークは、登録のこれらの種類を行うための高度な機能をしているが、私は個人的にはむしろ私のデザインを変更このような問題を解決するためのアプリケーションです。これにより、DI構成が簡単になり、コードを理解しやすくなります。特に、何らかのコンテキスト(スレッド、要求など)に依存するオブジェクトの作成や、明示的に管理する必要がある存続期間を持つために、私はファクトリを定義するのが好きです。工場は、これらのことをもっと明示します。

状況によっては、特定のユーザーのプロファイルを取得する必要があります。これは典型的にあなたが工場を持っていたいと思うものです。ここに例があります:

// Definition 
public interface IProfileFactory 
{ 
    IProfile CreateProfileForUser(string username); 
} 

// Usage 
var profile = Container.Resolve<IProfileFactory>() 
    .CreateProfileForUser("John"); 

// Registration 
Container.RegisterType<IProfileFactory, ProfileFactory>(); 

// Mock implementation 
public class ProfileFactory : IProfileFactory 
{ 
    public IProfile CreateProfileForUser(string username) 
    { 
     IUser user = Container.Resolve<IUserManager>() 
      .GetUser(username); 

     return new UserProfile(user); 
    } 
} 

私はこれが役立つことを望みます。

+0

私はこのような例について私に混乱を招くと思います(私たちはコンテナを呼び出しました)。私はそれを覚えています... – brumScouse

+0

申し訳ありませんが、私はちょうど上のコメントを見た... – brumScouse

+0

スティーブン..非常に、シンプル、効果的な..それは私の魅力のように動作します – alhpe

6

Resolveメソッドでは、ResolverOverrideのパラメータを渡すことができます。 ResolverOverrideのサブタイプは、解決されたコンストラクターにパラメーターを渡すために使用できるParameterOverrideです。

あなたはこのようにそれを行うことができます(パラメータは名前と渡された値ジョンである):

Container.Resolve<IProfile>(new ParameterOverride("Name", "John")); 
+0

真実ですが、ファクトリメソッドに渡されたパラメータを取得できません – haim770

関連する問題