かずきのBlog

C#やJavaやRubyとメモ書き

目次

Blog 利用状況

ニュース

わんくまBlogが不安定になったため、前に書いてたはてなダイアリーにメインを移動します。
かずきのBlog@Hatena
技術的なネタは、こちらにも、はてなへのリンクという形で掲載しますが、雑多ネタははてなダイアリーだけに掲載することが多いと思います。
コメント
プログラマ的自己紹介
お気に入りのツール/IDE
プロフィール
経歴
広告
アクセサリ

書庫

日記カテゴリ

[C#][MEF]Managed Extensibility Framework入門 その3

[C#][MEF]Managed Extensibility Framework入門 その1
[C#][MEF]Managed Extensibility Framework入門 その2

その2で簡単なHello worldを作りました。
その3では、このHello worldをちょっと改良して、めんどくさかったクラスのインスタンスをコンテナに登録する部分と、DIコンテナチックに実装との間に一枚インターフェースを挟むようにしてみようと思います。

適当にコンソールアプリケーションを作成して、System.ComponentModel.Composition.dllを参照に追加します。

まず最初に、クラスのインスタンスを登録する部分を改善しようと思います。コンテナがどういう風にクラスのインスタンスを登録していくかを指定するものとして、~Catalogというものがあります。

その中に、System.ComponentModel.Composition.Hosting.AssemblyCatalogというものがあります。これは、指定したアセンブリの中にあるクラス群を自動で登録してくれるかわいい奴です。

ということでMainを、それをつかってコンテナを作成するように書きます。

using System.ComponentModel.Composition.Hosting;

namespace MEFSample2
{
    class Program
    {
        static void Main(string[] args)
        {
            // アセンブリからクラス登録してね
            var catalog = new AssemblyCatalog(typeof(Program).Assembly);
            // catalogを使用してコンテナを初期化
            var container = new CompositionContainer(catalog);
        }
    }
}

次に、GreeterとGreeterApp(前のエントリではApplicationって書いてたけどうつのがめんどくさくなったので短いAppにしました)を作成します。
各々、IGreeterとIGreetAppインターフェースと、それを実装するGreeterImplとGreetAppImplクラスがあります。

中身は対して変わりませんが、Export属性とかは、実装クラスのほうにつけて、Export属性の引数にインターフェースの型を指定します。
これでコンテナにIGreeterのインスタンス下さいと、問い合わせるとGreeterImplのインスタンスをくれるようになります。

IGreeterインターフェースとGreeterImplクラス

using System.ComponentModel.Composition;

namespace MEFSample2
{
    // 挨拶をする人が実装すべきインターフェース
    public interface IGreeter
    {
        string Greet();
    }

    // IGreeterの実装 IGreeterインターフェースをキーにしてExportする
    [Export(typeof(IGreeter))]
    public class GreeterImpl : IGreeter
    {
        // 単純にHello worldを返す
        public string Greet()
        {
            return "Hello world";
        }
    }
}

IGreetAppインターフェースとGreetAppImplクラス

using System;
using System.ComponentModel.Composition;

namespace MEFSample2
{
    // 挨拶アプリケーションの実装すべきインターフェース
    public interface IGreetApp
    {
        void Run();
    }

    // IGreetAppの実装 IGreetAppをキーにしてExportする
    [Export(typeof(IGreetApp))]
    public class GreetAppImpl : IGreetApp
    {
        // IGreeterをImportする
        [Import]
        public IGreeter Greeter { get; set; }

        public void Run()
        {
            // ちゃんとGreeterにインスタンスが設定されてれば挨拶が表示されるはず
            Console.WriteLine(this.Greeter.Greet());
        }
    }
}

何処にExportとImportがついてるかがポイントです。
さて、最後に、Mainを実装します。コンテナからIGreetAppのインスタンスを取得してRunメソッドを呼び出します。

using System.ComponentModel.Composition.Hosting;

namespace MEFSample2
{
    class Program
    {
        static void Main(string[] args)
        {
            // アセンブリからクラス登録してね
            var catalog = new AssemblyCatalog(typeof(Program).Assembly);
            // catalogを使用してコンテナを初期化
            var container = new CompositionContainer(catalog);

            // 実行!
            var app = container.GetExportedObject<IGreetApp>();
            app.Run();
        }
    }
}

だいぶスッキリしました。

投稿日時 : 2009年7月1日 13:01

Feedback

# aQWyYmNSYElISGZI 2011/12/27 19:07 http://www.spytown.com/

Current blog, fresh information, I read it from time to time!!...

# SvsaudvBgWbVXk 2011/12/29 20:28 http://www.healthinter.org/health/page/protonix.ph

Cool:) I would say say it exploded my brain..!

# NSWHUPKgEquMtkYbS 2012/01/07 8:48 http://www.luckyvitamin.com/m-153-garden-of-life

Thanks for all the answers:) In fact, learned a lot of new information. Dut I just didn`t figure out what is what till the end!...

# Burberry Tie 2012/10/25 8:16 http://www.burberryoutletonlineshopping.com/burber

Some genuinely fantastic posts on this website, thanks for contribution. "My salad days, When I was green in judgment." by William Shakespeare.
Burberry Tie http://www.burberryoutletonlineshopping.com/burberry-ties.html

# cheap burberry bags 2012/10/27 22:09 http://www.burberryoutletonlineshopping.com/burber

Some really excellent posts on this web site , thanks for contribution.
cheap burberry bags http://www.burberryoutletonlineshopping.com/burberry-tote-bags.html

# burberry bag 2012/10/28 13:47 http://www.burberryoutletscarfsale.com/burberry-ba

You are my breathing in, I own few blogs and sometimes run out from brand :). "Never mistake motion for action." by Ernest Hemingway.
burberry bag http://www.burberryoutletscarfsale.com/burberry-bags.html

# Nike Schehe 2012/10/30 21:05 http://www.nikefree3runschuhe.com/

If you require a certain accounting of cost, count relations.
Nike Schehe http://www.nikefree3runschuhe.com/

# cheap tie 2012/10/31 19:29 http://www.burberrysalehandbags.com/burberry-ties.

hello!,I love your writing so much! share we be in contact extra approximately your post on AOL? I need an expert in this area to solve my problem. Maybe that's you! Having a look forward to peer you.
cheap tie http://www.burberrysalehandbags.com/burberry-ties.html

# burberry watches on sale 2012/10/31 19:29 http://www.burberrysalehandbags.com/burberry-watch

Hello, Neat post. There is an issue with your website in web explorer, would check this… IE nonetheless is the market chief and a big component to other folks will pass over your fantastic writing because of this problem.
burberry watches on sale http://www.burberrysalehandbags.com/burberry-watches.html

# burberry womens shirts 2012/10/31 19:29 http://www.burberrysalehandbags.com/burberry-women

I love the efforts you have put in this, regards for all the great articles.
burberry womens shirts http://www.burberrysalehandbags.com/burberry-womens-shirts.html

# cheap burberry bags 2012/10/31 19:30 http://www.burberrysalehandbags.com/burberry-tote-

I do consider all the concepts you've presented in your post. They are really convincing and will certainly work. Still, the posts are too short for beginners. May you please lengthen them a bit from next time? Thanks for the post.
cheap burberry bags http://www.burberrysalehandbags.com/burberry-tote-bags.html

# mens shirts 2012/10/31 19:30 http://www.burberrysalehandbags.com/burberry-men-s

I have not checked in here for some time because I thought it was getting boring, but the last several posts are good quality so I guess I will add you back to my daily bloglist. You deserve it friend :)
mens shirts http://www.burberrysalehandbags.com/burberry-men-shirts.html

タイトル  
名前  
Url
コメント