Tôi đang cố gắng triển khai Dependency injection
trong ứng dụng MVC của mình. Tôi đang sử dụng Unity.Mvc3.dll
cho IoC. Tôi chỉ tự hỏi làm thế nào Unity không thể đăng ký các loại từ một hội đồng khác. Dưới đây là các mã:Unity: Không thể đăng ký loại từ assembly khác nhau
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;
}
}
}
Cách sử dụng trong điều khiển 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
luôn là null trong khi tin nhắn là OK.
Đây là PlayerService
Lớp
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();
}
}
đây là Thông báo lỗi hoàn
Nghị quyết của sự phụ thuộc thất bại, type = "System.Web.Mvc.IControllerFactory", name = "(không ai)".
Đã xảy ra ngoại lệ trong khi: trong khi giải quyết.
Ngoại lệ là: InvalidOperationException - Loại hiện tại, System.Web.Mvc.IControllerFactory, là một giao diện và không thể được xây dựng. Bạn đang thiếu một ánh xạ kiểu?
sẽ làm, nhờ – lincx
thuộc tính InjectionConstructor thư viện nào được bao gồm? – lincx
http://msdn.microsoft.com/en-us/library/microsoft.practices.unity.injectionconstructorattribute(v=pandp.20).aspx –