0

私のソースはhttps://github.com/tonyeung/generic-repoにあります

さまざまなプロジェクトで参照できる汎用リポジトリを作成したいと考えています。私が見たほとんどの一般的なリポジトリの実装では、それが困難になっています。私は偶然http://blog.damianbrady.com.au/2012/07/24/a-generic-repository-and-unit-of-work-implementation-for-entity-framework/に出くわし、それがうまくいくことを発見しました私が考えていることのために。私のプロジェクトのそれぞれは、それに定義されたコンテキストを持つことができます。その後、汎用リポジトリ プロジェクトまたは dll を参照し、コンテキストを渡すだけで準備完了です。

私が理解しようとしている唯一のことは、解決する必要があるネストされた依存関係がいくつかあるため、構造マップをどのように配線するかです。残念ながら、このブログでは、汎用リポジトリを使用して依存性注入を実装する方法については実際には触れていません。実装をいじってみましたが (上記の git ハブ リポジトリを参照)、構造マップの構成中に何か問題が発生しています。

依存関係は次のように機能します。リポジトリはコンストラクターでコンテキストを取得し、コンテキストは接続文字列を取得します。コンストラクターのパラメーターはすべて、IType を Type にマップする既定の規則に一致するインターフェイスです。自動登録があるので、コンテキストの登録を明示的に定義して、app.config から接続文字列を取得するように structuremap に指示するだけでよいと思います。

ただし、構造マップは、思ったように登録を行うことができません。

StructureMap Exception Code:  202
No Default Instance defined for PluginFamily Generic_Repository_Test.IGenericRepository`1
    [[ViewModel.Customer, ViewModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]], 
    Generic Repository Test, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"

登録コード

        //This is commented out since it should not be necessary.
        //I tried to put this in for grins
        //and see if it would resolve the issue but it doesn't.
        //For<IGenericRepository<Customer>>().Use<GenericRepository<CustomerContext, Customer>>();

        For<ICustomerContext>()
                .Use<CustomerContext>()
                .Ctor<string>("connectionString")
                .EqualToAppSetting("ConnectionString");

        //I've tried moving scan to the top but it didn't make a difference
        Scan(x =>
        {
            x.AssembliesFromApplicationBaseDirectory();
            x.WithDefaultConventions();
        });
4

1 に答える 1

0

実際、この問題は構成の問題であることが判明しました。問題は、app.settings 接続文字列設定が null を返すことでした。なぜそうなるのかはわかりませんが、接続文字列をニヤリとハードコーディングしました。後でその問題を解決します。

それが解決された後も、別のエラーがポップアップしたため、レポとコンテキストを手動で構成する必要がありました。

それが解決されると、structuremap がそれ自体を解決しようとしているように見えるため、名前空間の除外を追加する必要がありました。

完成したコードは次のようになります。

public class DependencyRegistry : Registry
{
    public DependencyRegistry()
    {
        For<ICustomerContext>()
                .Use<CustomerContext>()
                .Ctor<string>("connectionString")
            //.EqualToAppSetting("ConnectionString");
                .Is(@"Data Source=(localdb)\Projects;Initial Catalog=EventStorage;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False");
        For<IGenericRepository<Customer>>().Use<GenericRepository<ICustomerContext, Customer>>();


        Scan(x =>
        {
            x.AssembliesFromApplicationBaseDirectory();
            x.ExcludeNamespace("StructureMap");
            x.WithDefaultConventions();
        });
    }
}
于 2013-03-27T18:00:30.323 に答える