2013-09-06 50 views
8

Có cách nào để giải quyết vấn đề này với Unity 3 ???Unity 3 và Error "Không thể giải quyết tên hoặc bí danh" xxxxx ". Vui lòng kiểm tra tệp cấu hình của bạn và xác minh tên loại này."

Tôi đã thực hiện tất cả những gì có thể để bỏ qua lỗi tin nhắn này, nhưng tôi không thể giải quyết ... Tôi là 2 ngày cố gắng giải quyết, và đã làm tất cả mọi thứ tôi đã nhìn thấy trong tìm kiếm googles.

Tôi gần như đã từ bỏ và thử một giải pháp DI khác. Xin vui lòng, bất kỳ sự giúp đỡ sẽ ổn thôi ...

tập tin cấu hình của tôi:

<?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> 

giao diện của tôi:

using Biblioteca.Transport; 
using System.Linq; 

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

lớp bê tông của tôi:

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(); 
     } 
    } 
} 

My 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(); 
     } 
    } 
} 

My Bootstrapper lớp:

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; 
     } 
    } 
} 

My dự án phụ thuộc tĩnh lớp:

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>(); 
     } 
    } 
} 

UI mô hình tập tin của tôi lớp về dự án MVC 4. Tôi đang sử dụng khung 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); 
      } 
     } 
    } 
} 

Tôi nghĩ mọi thứ đều đúng. Nhưng, tôi không thể thấy công trình DI này khiến tôi gặp lỗi trong quá trình lập bản đồ, bên dưới lớp Bootstrapper của tôi, phương thức BuildUnityContainer:

var container = new UnityContainer(). LoadConfiguration (unitySection);

Lỗi này là:

Tên loại hoặc bí danh Biblioteca.Contracts.IManterCategoriaBO thể không được giải quyết. Vui lòng kiểm tra tệp cấu hình của bạn và xác minh tên này .

Tôi đã kiểm tra kỹ tất cả các lớp học của mình và cho tôi, chúng ổn. Hay là nó thiếu cái gì?

tôi cần sự giúp đỡ, vì tôi có một thời gian ngắn để chăm sóc này ....

Kính trọng, Marcelo.

+0

Hội đồng của bạn có được đặt tên mạnh không? Tôi đã tìm thấy rằng đôi khi tôi phải sử dụng một tên đầy đủ loại (với khóa công khai) để có được nó để tải thông qua cấu hình Unity. Ngay cả với các assembly không mạnh, tôi đã phải thêm phần assembly vào tên kiểu. –

Trả lời

11

Sự cố nằm trong tệp cấu hình của bạn. Bạn đang trộn hai khái niệm với một số cú pháp không chính xác.

Các nút <assembly... /><namespace ... /> cung cấp thứ tự tìm kiếm không gian tên và lắp ráp khi nút <register ... /> của bạn chứa loại không thể tự tìm thấy. Nếu không thể tìm thấy loại, nó sẽ tìm kiếm qua tất cả các kết hợp của [namespace].Type, [assembly]. Đây là nơi lỗi xảy ra: nó KHÔNG tìm kiếm Type, [assembly]. Nếu có bất kỳ nút nào trong số <namespace ... /> được xác định, nó KHÔNG cố gắng nối thêm phần lắp ráp.

Vì vậy, nút <register type="Biblioteca.Contracts.IManterCategoriaBO" mapTo="Biblioteca.Business.ManterCategoriaBO" /> của bạn có loại Biblioteca.Contracts.IManterCategoriaBO không chứa cụm, vì vậy không thể tìm thấy nó. Do đó, nó cần phải thực hiện tìm kiếm. Bạn đã chỉ định các nút <namespace ... />, vì vậy trước tiên nó sẽ thử Biblioteca.Biblioteca.Contracts.IManterCategoriaBO, Biblioteca. Chú ý tên Biblioteca trùng lặp.

Đây là tệp cấu hình được sửa.

<?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="IManterCategoriaBO" mapTo="ManterCategoriaBO" /> 
     <!-- Or this works --> 
     <!--<register type="Biblioteca.Contracts.IManterCategoriaBO, Biblioteca" mapTo="Biblioteca.Business.ManterCategoriaBO, Biblioteca" />--> 
    </container> 
    </unity> 
</configuration> 
+0

Tài liệu về tính năng này có thể được tìm thấy trong [tệp trợ giúp này] (https://unity.codeplex.com/downloads/get/669364) trong Định cấu hình Unity -> Cấu hình Thiết kế-Thời gian -> Chỉ định Loại trong Tệp Cấu hình -> Tra cứu kiểu tự động. – TylerOhlsen

+0

Xin chào Tyler, không đời nào ... Tôi đã làm những gì bạn đã nói. Nhưng vấn đề vẫn tồn tại. – Olivertech

+0

Tôi đã có thể tạo lại lỗi và sửa lỗi với những gì tôi đã nói ở đây. Không chắc chắn lý do tại sao nó sẽ không làm việc cho bạn. Nó không hoạt động với tên hội đủ điều kiện? TylerOhlsen

4

Một ít thông tin mà không ai nói đến là tôi cần tham chiếu đến tất cả các dự án sẽ được sử dụng bởi sự đoàn kết.

Vì vậy, trong giải pháp của tôi, bên trong dự án web Biblioteca của tôi, nó là cần thiết để tham khảo Biblioteca.Business và Biblioteca.Contracts để có thể vượt qua đăng ký thống nhất mà không có bất kỳ lỗi nào. Tôi chỉ nói đến cái cuối cùng.

Thật đáng kinh ngạc, nhưng đó là vấn đề của tôi !!! Tôi nghĩ rằng sự thống nhất đã có thể làm cho một số loại refletion bằng cách sử dụng tất cả các đường dẫn bao gồm bên trong tập tin unity.config của tôi. Nhưng tôi đã sai. Để làm cho Unity hoạt động, cần thiết để tham khảo tất cả các dự án nằm trong tệp unity.config. Nếu tôi trỏ đến một số không gian tên, dự án liên quan cần phải được tham chiếu.

Tôi đã giải quyết được vấn đề, nhưng tôi không đồng ý với cách tiếp cận này để làm cho công trình đoàn kết. Nhưng, dù sao, nó hoạt động ngay bây giờ !!!

Cảm ơn bất kỳ cách nào Tyler, hỗ trợ của bạn.

+5

Bạn không _need_ một tham chiếu khó khăn để hội đồng khác của bạn. Chúng chỉ cần được tải trong miền ứng dụng hiện tại. Nếu bạn muốn nó năng động hơn, bạn có thể viết mã của riêng bạn sử dụng sự phản chiếu để nạp các assembly cần thiết của bạn vào miền ứng dụng với một lời gọi tới 'Assembly.Load (" Biblioteca.Business ")' và 'Assembly.Load (" Biblioteca.Contracts ")' trước khi bạn gọi đến 'UnityContainer.LoadConfiguration (...)'. – TylerOhlsen

+1

Tham chiếu là không cần thiết, nếu bạn tự sao chép các tệp DLL vào thư mục bin cũng sẽ hoạt động. Một ví dụ là tôi có một ứng dụng chung mà các cuộc thăm dò bằng cách sử dụng bất kỳ việc thực hiện nào tôi cung cấp cho nó, nghĩa là, tôi gắn đúng DLL trong thư mục bin và định cấu hình ứng dụng để sử dụng DLL đó. Không cần phải tải DLL trong mã, phần Unity config (assembly) thực hiện điều đó. Mã duy nhất được yêu cầu là tạo UnityContainer mới, gọi LoadConfiguration rồi giải quyết giao diện. –

2

Như đã nêu trong nhận xét trước, bạn có thể tự lắp ráp bộ phản chiếu trước khi gọi UnityContainer.LoadConfiguration(...). Đây là một cách chung chung để làm như vậy.

Chỉ cần chắc chắn rằng hội đồng của bạn có thể được tìm thấy theo tên. Điều này có thể được thực hiện bằng cách đặt assembly vào thư mục bin của ứng dụng của bạn. Hoặc thêm đường dẫn <probing> vào cấu hình ứng dụng của bạn. Hoặc thêm chúng vào Global Assembly Cache (GAC), nhưng tôi không khuyên bạn nên sử dụng nó.

private static void LoadDependencyAssemblies() 
{ 
    UnityConfigurationSection section = ConfigurationManager.GetSection(UnityConfigurationSection.SectionName) as UnityConfigurationSection; 
    if (section == null) 
    { 
     throw new ConfigurationErrorsException("Unable to locate Unity configuration section."); 
    } 

    foreach (string assemblyName in section.Assemblies.Select(element => element.Name)) 
    { 
     try 
     { 
      Assembly.Load(assemblyName); 
     } 
     catch (Exception ex) 
     { 
      throw new ConfigurationErrorsException("Unable to load required assembly specified in Unity configuration section. Assembly: " + assembly, ex); 
     } 
    } 
} 
+0

Tôi cần phải tải lắp ráp dự án trong giải pháp của mình, được đặt trong thư mục /Main/Libraries từ mã của một dự án giải pháp khác, được đặt trong /Shop? Bạn có thể mô tả trong câu trả lời của bạn làm thế nào để sử dụng cho nó? –

+0

Tôi giả sử bạn có nghĩa là thay vì . Tôi có thể sử dụng một cái gì đó như thế này: TylerOhlsen

0

Tôi chỉ dành phần lớn thời gian của mình khắc phục sự cố lỗi này.

Trong trường hợp của tôi không có lỗi trong cấu hình, nhưng hóa ra là một trong các hội đồng nắm giữ các loại bê tông phụ thuộc vào một hội đồng khác mà nó không thể tìm thấy.

Thật không may, Unity không gợi ý bất kỳ vấn đề nào khi tải hội đồng. Trong thực tế, assembly đã xuất hiện trong cửa sổ Modules trong Visual Studio Debugger. Vẫn không thể tải loại.

0

Nếu bạn ở đây từ google, cách đơn giản nhất để làm việc đó là xóa các công cụ <alias><namespace> và làm như sau.

<container> 
    <register type="MyApp.Repositories.IUserRepository, MyApp" mapTo="MyApp.Repositories.UserRepository, MyApp" /> 
</container> 

... trong đó MyApp là tên lắp ráp của bạn từ thuộc tính dự án -> Ứng dụng.

1

tôi đã nhận được thông báo lỗi này là tốt nhưng không tìm thấy một tập hợp các nguyên nhân:

  1. Tôi đang sử dụng một trình cài đặt WiX mà đã không đúng cách triển khai một số các dlls cần thiết cho việc lắp ráp mục tiêu (Trong ví dụ này nó sẽ là phụ thuộc của Biblioteca.Business). Vì vậy, hãy kiểm tra kỹ.
  2. Sau đó tôi chỉ nhận được thông báo lỗi khi chạy ở chế độ phát hành, chế độ gỡ lỗi hoạt động tốt. Biến lớp mapTo thành đích không được đánh dấu bằng thuộc tính "public". Đối với một số lý do này không quan trọng trong chế độ gỡ lỗi nhưng là một chặn trong chế độ phát hành.

Hy vọng rằng sẽ giúp ai đó vì nó đã chặn tôi trong hai ngày.