0

コンストラクターのインジェクションには Unity を使用しています。ランタイム API を介したコンストラクター インジェクションは、次のコードで成功します。

{
using ContractImplementations;
using Contracts;
using DataAccess;
using DataModel.Entities;
using DataModel.Interfaces;

using Microsoft.Practices.Unity;

using Unity.Wcf;

/// <summary>
/// The wcf service factory.
/// </summary>
public class WcfServiceFactory : UnityServiceHostFactory
{
    #region Methods
    /// <summary>
    /// Configure container.
    /// </summary>
    /// <param name="container">
    /// The container.
    /// </param>
    protected override void ConfigureContainer(IUnityContainer container)
    {
        container
           .RegisterType<IGaugeModelbaseService, GaugeModelbaseService>()
           .RegisterType<IContractMapper, ContractMapper>(new HierarchicalLifetimeManager())
           .RegisterType<IGenericRepository<GaugeModel>, GenericSqlRepository<GaugeModel>>(new HierarchicalLifetimeManager());
    }

    #endregion
}

}

ただし、AppFabric および EntLib との統合のため、XML 構成でコンテナーを構成する必要があります。問題: Unity のドキュメントは、ジェネリック型の登録に関して明確ではありません。ドキュメントによると、私は次のようなことをしなければなりません:

<?xml version="1.0" encoding="utf-8"?>

<namespace name="Design.ModelbaseSvc" />
<assembly name="Design.ModelbaseSvc" />
<namespace name="Design.ContractImplementations" />
<assembly name="Design.ContractImplementations" />
<namespace name="Design.DataModel" />
<assembly name="Design.DataModel" />
<namespace name="Design.DataAccess" />
<assembly name="Design.DataAcces" />


<container>
  <register type="IGaugeModelbaseService" mapTo="GaugeModelbaseService">
    <interceptor type="InterfaceInterceptor" />
  </register>
  <register type="IContractMapper" mapTo="ContractMapper">
    <lifetime type="hierarchical" />
  </register>
  <register type="IGenericRepository'1[Design.DataModel.Entities.GaugeModel, Design.DataModel]" mapTo="GenericSqlRepository'1[Design.DataModel.Entities.GaugeModel, Design.DataModel]">       
    <lifetime type="hierarchical" />
  </register>
</container>

何が間違っているのかわかりませんが、これは機能しません: - XML エディタが括弧 "[]" を使用するとエラーが発生する - svc ファイルを参照すると、次のエラーが発生します:

タイプ名またはエイリアス IGenericRepository'1[Design.DataModel.Entities.GaugeModel, Design.DataModel] を解決できませんでした。構成ファイルを確認して、このタイプ名を確認してください。

他にもいくつか試しましたが、最終的には脳死に至りました。助けてください。

ありがとう

フランス・バーホーベン

4

1 に答える 1

1

型ごとに、アセンブリと完全な名前空間を指定するか、エイリアスを使用する必要があります。

ジェネリック型では、エイリアスを使用しない場合は、二重角括弧を使用する必要があります:

<register 
      type="MyNameSpace.IGenericRepository'1[[Design.DataModel.Entities.GaugeModel, Design.DataModel]], MyAssembly"       
     mapTo="MyNameSpace.GenericSqlRepository'1[[Design.DataModel.Entities.GaugeModel, Design.DataModel]], MyAssembly">       
    <lifetime type="hierarchical" />
</register>
于 2012-09-24T06:15:20.747 に答える