1

Unity2.0 を使用しており、開いているジェネリック型を解決しようとしています。クラスは次のように定義されています。

public interface IRepository<T>
{
    void Add(T t);
    void Delete(T t);
    void Save();
}

public class SQLRepository<T> : IRepository<T>
{
    #region IRepository<T> Members
    public void Add(T t)
    {
        Console.WriteLine("SQLRepository.Add()");
    }
    public void Delete(T t)
    {
        Console.WriteLine("SQLRepository.Delete()");
    }
    public void Save()
    {
        Console.WriteLine("SQLRepository.Save()");
    }
    #endregion
}

構成ファイルは次のようになります。

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
  <namespace name="UnityTry"/>
  <assembly name="UnityTry"/>

  <container>
    <register type="IRepository[]" mapTo="SQLRepository[]" name="SQLRepo" />
  </container>
</unity>

IRepository を解決するコード:

        IUnityContainer container = new UnityContainer();

        UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection("unity");
        section.Containers.Default.Configure(container);

        IRepository<string> rep = container.Resolve<IRepository<string>>();
        rep.Add("World");

コードを実行すると、次の行で ResolutionFailedException が発生します。

IRepository<string> rep = container.Resolve<IRepository<string>>();

例外メッセージは次のとおりです。

Exception is: InvalidOperationException - The current type, UnityTry.IRepository`1    [System.String], is an interface and cannot be constructed. Are you missing a type mapping?

私が間違ったことをした人はいますか?

4

1 に答える 1

1

オープンジェネリックは「SQLRepo」という名前を使用してマッピングに登録されていますが、解決時に名前が提供されていないため、Unity はマッピングを見つけることができません。名前で解決してみてください:

IRepository<string> rep = container.Resolve<IRepository<string>>("SQLRepo");
于 2013-06-27T04:01:15.067 に答える