Unity.MVC5 IUserService类型没有可访问的构造函数

时间:2014-03-12 17:46:05

标签: c# asp.net-mvc inversion-of-control unity-container

我正在使用Repository模式并使用

container.RegisterTypes(
    AllClasses.FromLoadedAssemblies().Where(x =>
         x.Namespace != null && (x.Namespace.Contains("TM.Service") ||
          x.Namespace.Contains("TM.Repository"))
    ),
    WithMappings.FromMatchingInterface,
    WithName.Default,
    WithLifetime.PerResolve
 );

首先,每件事情都有效,但在运行时更改cshtml文件甚至是js文件后,(开始调试或启动而不调试)我得到"类型IUserService没有可访问的构造函数。&#34 ;错误! 这让我很生气,因为在更改js或cshtml文件之前这样做了。

发生此错误时,重新启动webapp无法正常工作甚至无法构建项目。让webapp再次运行的唯一方法是重建解决方案。

不过,我的存储库和服务都在不同的项目中。

更新:

public class UserService : BaseService<User, IUserRepository>, IUserService
    {
        public UserService(IUserRepository repository) : base(repository)
        {
            this.Repository = repository;
        }

}


public interface IUserService : IBaseService<User>
    {

    }

public interface IBaseService<TModel> : IDisposable where TModel : BaseEntity
    {
        object Create(TModel model);
        object Edit(TModel model, string[] blackFields = null, string[] whiteFields = null);
        object Delete(int id);
        IEnumerable GetAll();
        IEnumerable GetGridData();
        IEnumerable<TModel> FindBy(Expression<Func<TModel, bool>> predicate);
        int Count(Expression<Func<TModel, bool>> predicate);
    }


public interface IUserRepository : IBaseRepository<User>
{
}


public interface IBaseRepository<TModel> : IDisposable where TModel : BaseEntity
    {
        TMContext Context { get; set; }

        IDbSet<TModel> Entity { get; set; }

        IQueryable<TModel> All { get; }

        IQueryable<TModel> AllIncluding(params Expression<Func<TModel, object>>[] includeProperties);

        TModel Find(int id);

        IEnumerable<TModel> FindBy(Expression<Func<TModel, bool>> predicate);

        int Count(Expression<Func<TModel, bool>> predicate);

        void Insert(TModel model);

        void Update(TModel model, string[] blackFields = null, string[] whiteFields = null);

        void Delete(int id);

        void Save();

    }

和用法:

public class UserController : BaseController<User>
    {
        public UserController(IUserService service)
        {
            Service = service;
        }
    }

1 个答案:

答案 0 :(得分:1)

我设法通过在Application_Start中从服务程序集初始化一个虚拟类来解决这个问题。 工作代码看起来像

protected void Application_Start()
    {           
        //For IoC Sake!
        var dummyRepository = new DummyRepository();
        var dummyService = new DummyService();

        ...
    }