2

構造マップブートストラップで nancyfx をブートしようとしています https://github.com/NancyFx/Nancy.Bootstrappers.StructureMap

これが私のセットアップです:

        protected override void ConfigureApplicationContainer(IContainer container)
    {

        container.Configure(x =>
        {
            x.ForSingletonOf<IRazorConfiguration>()
                .Use<DefaultRazorConfiguration>();

           x.ForSingletonOf<ISessionContainer>().Use<SessionContainer>();

           x.For<IRepository>().LifecycleIs(new HttpContextLifecycle()).Use<Repository>();

            x.Scan(scanner=>
            {
                scanner.TheCallingAssembly();
                scanner.AddAllTypesOf<IRepository>();

            });
        });
        base.ConfigureApplicationContainer(container);
    }

 public interface IRepository
{
   void Save();
}

   public class Repository:IRepository
{

   ISessionContainer _session;
   public Repository(ISessionContainer container)
   {
       _session = container;
   }

   public void Save()
   {

   }
}

を使用するvar repo = ObjectFactory.GetInstance<IRepository>();と、次の例外が発生します。

StructureMap Exception Code:  202
No Default Instance defined for PluginFamily Infrastructure.IRepository, Infrastructure, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null 
4

2 に答える 2

6

ハックを取り除く手助けをしたいのですが...あなたの問題の原因は、ObjectFactory の使用方法にあります。NancyModule 内で「GetInstance」に ObjectFactory を使用するべきではありません。代わりに、リポジトリが必要な NancyModule のコンストラクターに IRepository を含める必要があります。次に、Structuremap (ブートストラッパーを使用して Nancy フレームワークに接続されています) は、インスタンス化されたときに具体的なリポジトリをモジュールに単純に挿入します。NancyModule の例を次に示します。

public class ProductModule : NancyModule {

    private IRepository _repository;

    public ProductModule(IRepository repository) {

        _repository = repository;

        SetupRoutes();
    }

    private void SetupRoutes() {
        Get["/product/{id}"] = p => {
            return _repository.Get<Product>((int)p.id);
        };        
    }
}

ここでは、モジュールはリポジトリを取得するために IOC を呼び出していません... 既に取得しています。あなたのブートストラップはこれを可能にします。これで、ObjectFactory のハックな構成を取り除くことができます。

一般的なアドバイスとして、型を解決するために「ObjectFactory」を使用していることに気付いた場合は、自分自身を平手打ちして入力をやめるべきです。代わりに、上で示したように、コンストラクター注入を使用して依存関係を注入する必要があります。

于 2012-10-16T18:43:11.583 に答える
1

提案された回答に何が起こったのかわかりませんが、この問題を解決した方法は次のとおりです。

protected override void ConfigureApplicationContainer(IContainer container)
{
    container.Configure(x =>
    {
        x.ForSingletonOf<IRazorConfiguration>()
            .Use<DefaultRazorConfiguration>();
        x.ForSingletonOf<ISessionContainer>().Use<SessionContainer>();//Duplicate
        x.Scan(scanner=>
        {
            scanner.TheCallingAssembly();
            scanner.AddAllTypesOf<IRepository>();
        });
    });
    ObjectFactory.Configure(x =>
    {
        x.ForSingletonOf<ISessionContainer>().Use<SessionContainer>();//Duplicate
        x.For<IRepository>().Use<Repository>();
    });
    base.ConfigureApplicationContainer(container);
}

これはハックですが、これが私がこれを機能させることができた唯一の方法です。

于 2012-08-27T03:54:35.153 に答える