Я пытаюсь реализовать Dependency injection
в моем приложении MVC. Я использую Unity.Mvc3.dll
для IoC. Мне просто интересно, как Unity не может регистрировать типы из другой сборки. Вот код:Единство: не удается зарегистрировать тип из другой сборки
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
var container = new UnityContainer();
// ok: register type from this assembly
container.RegisterType<IMessages, Messages>();
// fail: register type from another assembly (service reference)
container.RegisterType<IPlayerService, PlayerService>();
DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}
public class UnityDependencyResolver : IDependencyResolver
{
private readonly IUnityContainer _container;
public UnityDependencyResolver(IUnityContainer container)
{
this._container = container;
}
public object GetService(Type serviceType)
{
try
{
return _container.Resolve(serviceType);
}
catch (Exception ex)
{
throw ex;
}
}
public IEnumerable<object> GetServices(Type serviceType)
{
try
{
return _container.ResolveAll(serviceType);
}
catch (Exception ex)
{
throw ex;
}
}
}
Использование в контроллере MVC:
[Dependency]
public IPlayerService PlayerService { get; set; }
[Dependency]
public IMessages Messages { get; set; }
public ActionResult Index()
{
PlayerMessageViewModel vm = new PlayerMessageViewModel();
vm.Messages = Messages; // success!
vm.Players = PlayerService.Get(); // fail: null reference exception :PlayerService
return View(vm);
}
PlayerService
всегда нуль в то время как сообщения в порядке.
Вот PlayerService
Класс
public class PlayerService : IPlayerService
{
private readonly MyDbEntities _dbContext;
public PlayerService()
{
_dbContext = new MyDbEntities();
}
public PlayerService(MyDbEntities dbContext)
{
_dbContext = dbContext;
}
public IQueryable<Player> Get()
{
return _dbContext.Players.AsQueryable();
}
}
это полное сообщение об ошибке
Постановление зависимости не удалось, тип = "System.Web.Mvc.IControllerFactory", имя = «(никто)".
Исключение произошло во время: при разрешении.
Исключение: InvalidOperationException - текущий тип, System.Web.Mvc.IControllerFactory, является интерфейсом и не может быть сконструирован. Вам не хватает картографирования типов?
будет делать, спасибо – lincx
какой атрибут библиотеки InjectionConstructor включен? – lincx
http://msdn.microsoft.com/en-us/library/microsoft.practices.unity.injectionconstructorattribute(v=pandp.20).aspx –