9

Unity 3 でこの問題を解決する方法はありますか?

このメッセージ エラーを回避するために可能な限りのことを行いましたが、解決できません。私はすでにグーグル検索で見たことをすべてやった.

私はほとんどあきらめて、別の DI ソリューションを試しています。

私の構成ファイル:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
  </configSections>
  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
    <assembly name="Biblioteca" />
    <assembly name="Biblioteca.Contracts" />
    <assembly name="Biblioteca.Business" />
    <namespace name="Biblioteca" />
    <namespace name="Biblioteca.Contracts" />
    <namespace name="Biblioteca.Business" />
      <container>
        <register type="Biblioteca.Contracts.IManterCategoriaBO" mapTo="Biblioteca.Business.ManterCategoriaBO" />
      </container>
  </unity>
</configuration>

私のインターフェース:

using Biblioteca.Transport;
using System.Linq;

namespace Biblioteca.Contracts
{
    public interface IManterCategoriaBO
    {
        IQueryable<CategoriaDTO> GetAll();
        CategoriaDTO GetById(int id);
        void Insert(CategoriaDTO dto);
    }
}

私の具体的なクラス:

using Biblioteca.Contracts;
using Biblioteca.Transport;
using Biblioteca.Data;
using System;
using System.Linq;

namespace Biblioteca.Business
{
    public class ManterCategoriaBO : IManterCategoriaBO
    {
        public CategoriaDTO GetById(int id)
        {
            CategoriaDTO dto = new CategoriaDTO();
            ManterCategoriaDO categoriaDO = new ManterCategoriaDO();

            dto = categoriaDO.GetById(1);

            return dto;
        }

        public IQueryable<CategoriaDTO> GetAll()
        {
            throw new NotImplementedException();
        }

        public void Insert(CategoriaDTO dto)
        {
            throw new NotImplementedException();
        }
    }
}

私の Global.asax:

using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
using Biblioteca.Dependency;

namespace Biblioteca
{
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801

    public class MvcApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();

            WebApiConfig.Register(GlobalConfiguration.Configuration);
            FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
            BundleConfig.RegisterBundles(BundleTable.Bundles);

            //Below is a static variable to take the unity container
            //which is on a dependency project
            Global.Container = Bootstrapper.Initialise();
        }
    }
}

私のブートストラップクラス:

using Microsoft.Practices.Unity;
using Microsoft.Practices.Unity.Configuration;
using System.Configuration;
using System.Web.Mvc;
using Unity.Mvc4;

namespace Biblioteca
{
    public static class Bootstrapper
    {
        public static IUnityContainer Initialise()
        {
            var container = BuildUnityContainer();

            DependencyResolver.SetResolver(new UnityDependencyResolver(container));

            return container;
        }

        private static IUnityContainer BuildUnityContainer()
        {
            string path = ConfigurationManager.AppSettings["UnityConfigFilePath"].ToString();

            var fileMap = new ExeConfigurationFileMap() { ExeConfigFilename = path + "\\Unity.config" };

            System.Configuration.Configuration configuration = ConfigurationManager.OpenMappedExeConfiguration(fileMap, ConfigurationUserLevel.None);

            var unitySection = (UnityConfigurationSection)configuration.GetSection("unity");

            //*** this line is firing the error !!! ****
            var container = new UnityContainer().LoadConfiguration(unitySection);

            return container;
        }
    }
}

私の依存関係プロジェクトの静的クラス:

using Microsoft.Practices.Unity;

namespace Biblioteca.Dependency
{
    public static class Global
    {
        public static IUnityContainer Container = null;

        public static T Resolve<T>()
        {
            return Container.Resolve<T>();
        }
    }
}

MVC 4 プロジェクトの UI モデル クラス ファイル。私は4.5フレームワークを使用しています。

using Biblioteca.Contracts;
using Biblioteca.Dependency;

namespace Biblioteca.Models
{
    public class LivroModel
    {
        public void GetAll()
        {
            if (Global.Container != null)
            {
                var categoriaBO = Global.Resolve<IManterCategoriaBO>();
                categoriaBO.GetById(1);
            }
        }
    }
}

すべてが正しい方向に進んでいると思います。しかし、この DI の動作を確認できません。これは、マッピング プロセスでエラーが発生したためです。以下の Bootstrapper クラスの BuildUnityContainer メソッドの行で:

var コンテナー = 新しい UnityContainer().LoadConfiguration(unitySection);

エラーは次のとおりです。

タイプ名または別名 Biblioteca.Contracts.IManterCategoriaBO を解決できませんでした。構成ファイルを確認して、このタイプ名を確認してください。

私はすべてのクラスを再確認しましたが、私にとっては問題ありません。それとも何かが欠けていますか?

4

6 に答える 6

4

どこにも誰も言っていない小さな情報は、unity で使用されるすべてのプロジェクトを参照する必要があるということです。

したがって、私のソリューションでは、Biblioteca Web プロジェクト内で、Biblioteca.Business と Biblioteca.Contracts を参照して、ユニティ レジスタをエラーなしで通過できるようにする必要がありました。私は最後のものだけを参照していました。

それは信じられないほどですが、それが私の問題でした!!! Unity は、unity.config ファイル内に含まれるすべてのパスを使用して、ある種の反省を行うことができたと思います。しかし、私は間違っていました。Unity を機能させるには、unity.config ファイル内にあるすべてのプロジェクトを参照する必要があります。名前空間を指す場合は、関連するプロジェクトを参照する必要があります。

私はすでに問題を解決しましたが、統一を機能させるためのこのアプローチには同意しません。しかし、とにかく、それは今働いています!!!

タイラー、サポートしてくれてありがとう。

于 2013-09-10T15:20:39.520 に答える
1

私はこのエラーのトラブルシューティングに 1 日のかなりの時間を費やしています。

私の場合、構成にエラーはありませんでしたが、具象型を保持するアセンブリの 1 つが、見つからない別のアセンブリに依存していることが判明しました。

残念ながら、Unity はアセンブリの読み込みに関する問題を示唆していませんでした。実際、アセンブリは Visual Studio デバッガーの [モジュール] ウィンドウに表示されました。まだタイプをロードできませんでした。

于 2015-06-03T21:57:45.070 に答える