CSharp - 统一引导程序( unity.mvc ),Unity 3,MVC 5,EF6接收错误: 在控制器上,无参数 public 构造函数

  显示原文与译文双语对照的内容
0 0

好了,在搜索Google之后,这里和几个 asp/mvc论坛,我必须要询问我在这里做什么。

我对我的应用程序有一个好的开始,一个好的理解,正在使用库,服务和UnitOfWork模式。 当我试图加载一个需要从fusion中获得的控制器时,它就像是没有解决任何已经注册的项目。 从我可以看到的这个版本的( 不是创建 Bootstrap.cs 文件的版本,然后从 global.asax 调用它) 来看,我正在做别人从统一中完成的任何事情。

我的核心问题是:我已经安装/配置了,根据需要将这些项插入到控制器构造函数中。 如果我有的话,为什么它不像我所见的例子那样工作?

我一直认为AssetController需要一个无参数的public 构造函数。 如果我添加一个,然后它使用它,如果我没有添加,如果我不添加一个,它叫不 Having 。

谢谢,下面的代码。

UnityConfig.cs


namespace CARS.web.App_Start
{
///<summary>
///Specifies the Unity configuration for the main container.
///</summary>
 public class UnityConfig
 {
 #region Unity Container
 private static Lazy<IUnityContainer> container = new Lazy<IUnityContainer>(() =>
 {
 var container = new UnityContainer();
 RegisterTypes(container);
 return container;
 });

///<summary>
///Gets the configured Unity container.
///</summary>
 public static IUnityContainer GetConfiguredContainer()
 {
 return container.Value;
 }
 #endregion

///<summary>Registers the type mappings with the Unity container.</summary>
///<param name="container">The unity container to configure.</param>
///<remarks>There is no need to register concrete types such as controllers or API controllers (unless you want to 
///change the defaults), as Unity allows resolving a concrete type even if it was not previously registered.</remarks>
 public static void RegisterTypes(IUnityContainer container)
 {
//NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements.
//container.LoadConfiguration();

//TODO: Register your types here
//container.RegisterType<IProductRepository, ProductRepository>();
 container.RegisterType<IDataContext, CARSDEMOContext>(new PerRequestLifetimeManager())
. RegisterType<IAssetService, AssetService>()
. RegisterType<IUnitOfWork, UnitOfWork>()
. RegisterType<IRepository<Asset>, Repository<Asset>>();
//.RegisterType<AssetController>(new InjectionConstructor(typeof(IAssetService), typeof(IUnitOfWork)));
 }
 }
}

AssetController.cs ( 我正在执行注入参数的构造函数部分)


namespace CARS.web.Controllers
{
 public class AssetController : Controller
 {
 private readonly IAssetService _assetService;
 private readonly IUnitOfWork _unitOfWork;

 public AssetController(IAssetService assetService, IUnitOfWork unitOfWork)
 {
 _assetService = assetService;
 _unitOfWork = unitOfWork;
 }
//other methods for CRUD etc stripped for brevity
 }
}

IAssetService.cs ( 第一个参数是 assetService )


namespace CARS.service
{
 public interface IAssetService : IService<Asset>
 {
 Task<IEnumerable<Asset>> GetAsync();
 Task<Asset> FindAsync(Guid id);
 Asset Add(Asset asset);
 Asset Update(Asset asset);
 void Remove(Guid id);
 }
}

AssetService.cs ( IAssetService交互的具体实现)


namespace CARS.service
{


 public class AssetService : Service<Asset>, IAssetService
 {
 private readonly IRepositoryAsync<Asset> _repository;

 public AssetService(IRepositoryAsync<Asset> repository) : base(repository)
 {
 _repository = repository;
 }

 public Task<IEnumerable<Asset>> GetAsync()
 {
//return _repository.Query().SelectAsync();
 return _repository.Query().SelectAsync();
 }

 public Task<Asset> FindAsync(Guid id)
 {
 return _repository.FindAsync(id);
 }

 public Asset Add(Asset asset)
 {
 _repository.Insert(asset);
 return asset;
 }

 public Asset Update(Asset asset)
 {
 _repository.Update(asset);
 return asset;
 }

 public void Remove(Guid id)
 {
 _repository.Delete(id);
 }
 }

}

IUnitOfWork.cs ( 这是来自于le和存储库的长泛型- http://genericunitofworkandrepositories.codeplex.com/


namespace Repository.Pattern.UnitOfWork
{
 public interface IUnitOfWork : IDisposable
 {
 int SaveChanges();
 Task<int> SaveChangesAsync();
 void Dispose(bool disposing);
 IRepository<TEntity> Repository<TEntity>() where TEntity : IObjectState;
 void BeginTransaction();
 bool Commit();
 void Rollback();
 }
}

UnitOfWork.cs ( 从le的长框架中再次)


namespace Repository.Pattern.Ef6
{
 public class UnitOfWork : IUnitOfWork, IUnitOfWorkAsync
 {
 #region Private Fields

 private readonly IDataContextAsync _dataContext;
 private bool _disposed;
 private ObjectContext _objectContext;
 private Dictionary<string, object> _repositories;
 private DbTransaction _transaction;

 #endregion Private Fields

 #region Constuctor/Dispose

 public UnitOfWork(IDataContextAsync dataContext)
 {
 _dataContext = dataContext;
 }

 public void Dispose()
 {
 if (_objectContext!= null && _objectContext.Connection.State == ConnectionState.Open)
 _objectContext.Connection.Close();

 Dispose(true);
 GC.SuppressFinalize(this);
 }

 public virtual void Dispose(bool disposing)
 {
 if (!_disposed && disposing)
 _dataContext.Dispose();
 _disposed = true;
 }

 #endregion Constuctor/Dispose

 public int SaveChanges()
 {
 return _dataContext.SaveChanges();
 }

 public IRepository<TEntity> Repository<TEntity>() where TEntity : IObjectState
 {
 return RepositoryAsync<TEntity>();
 }

 public Task<int> SaveChangesAsync()
 {
 return _dataContext.SaveChangesAsync();
 }

 public Task<int> SaveChangesAsync(CancellationToken cancellationToken)
 {
 return _dataContext.SaveChangesAsync(cancellationToken);
 }

 public IRepositoryAsync<TEntity> RepositoryAsync<TEntity>() where TEntity : IObjectState
 {
 if (_repositories == null)
 _repositories = new Dictionary<string, object>();

 var type = typeof (TEntity).Name;

 if (_repositories.ContainsKey(type))
 return (IRepositoryAsync<TEntity>) _repositories[type];

 var repositoryType = typeof (Repository<>);
 _repositories.Add(type, Activator.CreateInstance(repositoryType.MakeGenericType(typeof (TEntity)), _dataContext, this));

 return (IRepositoryAsync<TEntity>) _repositories[type];
 }

 #region Unit of Work Transactions

 public void BeginTransaction()
 {
 _objectContext = ((IObjectContextAdapter) _dataContext).ObjectContext;
 if (_objectContext.Connection.State!= ConnectionState.Open)
 {
 _objectContext.Connection.Open();
 _transaction = _objectContext.Connection.BeginTransaction();
 }
 }

 public bool Commit()
 {
 _transaction.Commit();
 return true;
 }

 public void Rollback()
 {
 _transaction.Rollback();
 ((DataContext)_dataContext).SyncObjectsStatePostCommit();
 }

 #endregion

//Uncomment, if rather have IRepositoryAsync<TEntity> IoC vs. Reflection Activation
//public IRepositoryAsync<TEntity> RepositoryAsync<TEntity>() where TEntity : EntityBase
//{
//return ServiceLocator.Current.GetInstance<IRepositoryAsync<TEntity>>();
//}
 }
} 

更新以包括 UnityMvcActivator.cs 中的SetResolver信息


using System.Linq;
using System.Web.Mvc;
using Microsoft.Practices.Unity.Mvc;

[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(CARS.web.App_Start.UnityWebActivator),"Start")]

namespace CARS.web.App_Start
{
///<summary>Provides the bootstrapping for integrating Unity with ASP.NET MVC.</summary>
 public static class UnityWebActivator
 {
///<summary>Integrates Unity when the application starts.</summary>
 public static void Start() 
 {
 var container = UnityConfig.GetConfiguredContainer();

 FilterProviders.Providers.Remove(FilterProviders.Providers.OfType<FilterAttributeFilterProvider>().First());
 FilterProviders.Providers.Add(new UnityFilterAttributeFilterProvider(container));

 DependencyResolver.SetResolver(new UnityDependencyResolver(container));

//TODO: Uncomment if you want to use PerRequestLifetimeManager
 Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility.RegisterModule(typeof(UnityPerRequestHttpModule));
 }
 }
}

我已经阅读/尝试以下信息/数据,但没有任何内容修复了它:

类型IUserStore`1没有可以访问的构造函数

如何将 5认证添加到统一IoC中

类型没有用统一 [MVC 5 ] 解析

我已经准备好写一个ControllerFactory以便能够做到这一点,但是当我发现的所有例子都在控制器上。

最后是错误:


The following server error was encountered: 
An error occurred when trying to create a controller of type 'CARS.web.Controllers.AssetController'. Make sure that the controller has a parameterless public constructor.Details are: 
at System.Web.Mvc.DefaultControllerFactory.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) at System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) at System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionSte p.Execute() at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

谢谢

时间: 原作者:

0 0

你需要设置 DependencyResolver 。 我看不到你提供的示例中的代码。

设置好UnityContainer并注册类型后,需要设置收费的System.Web.MVC.DependencyResolver 。


 DependencyResolver.SetResolver(new UnityDependencyResolver(container));

原作者:
0 0

你可以能错过了( 我做了) 以在 UnityConfig.cs 中 register的异步类型
检查你是否拥有:


container.RegisterType<IUnitOfWork, UnitOfWork>(new PerRequestLifetimeManager())
. RegisterType<IUnitOfWorkAsync, UnitOfWork>(new PerRequestLifetimeManager())
. RegisterType<IDataContextAsync, SomeDBContext>(new PerRequestLifetimeManager())
. RegisterType<IDataContext, SomeDBContext>(new PerRequestLifetimeManager())
. RegisterType<ISomeService, SomeService>(new PerRequestLifetimeManager())
. RegisterType<IRepositoryAsync<Some>, Repository<Some>>(new PerRequestLifetimeManager());

...