У меня есть веб-приложение MVC, которое использует Autofac для внедрения сервисов в контроллеры.
Проблема: я пытаюсь внедрить свойство в службу, и мне это не удается (свойство всегда имеет значение null).
Что я ожидаю: я ожидаю, что Autofac правильно инициализирует свойство (не нуль).
Пример:
- Я пытаюсь внедрить AliasesService как IAliasesService в контроллеры.
- AliasesService зависит от MailService.
- MailService является свойством AliasesService.
- AliasesService правильно создается и передается в MyController.
- MailService НЕ создан должным образом и установлен в свойство AliasesService.
Контроллер:
public class MyController: Controller
{
private IAliasesService AliasesService { get; set; }
public MyController(IAliasesService aliasesService)
{
AliasesService = aliasessService;
}
public ActionResult Index()
{
var model = aliasesService.GetUserRoles();
return View();
}
}
Глобальный.asax:
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly()).PropertiesAutowired();
builder.RegisterType<MailService>().As<IMailService>();
builder.RegisterType<AliasesService>().As<IAliasesService>().PropertiesAutowired();
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
Служба псевдонимов:
public class AliasesService
{
public IMailService MailService { get; set; }
public Dictionary<int,string> GetUserRoles()
{
MailService.SendMail("method GetUserRoleshas been called");
return null;
}
}
Стоит упомянуть:
- если я попытаюсь сделать инъекцию свойств для контроллеров, это сработает, как и ожидалось.
- внедрение конструктора работает, но мне нужно внедрение свойства.
Что еще я безуспешно пробовал:
1
builder.RegisterType<MailService>()
.As<IMailService>();
builder.Register(c => new AliasesService()
{
MailService = c.Resolve<IMailService>()
})
.As<IAliasesService>();
2
builder.RegisterType<MailService>()
.As<IMailService>();
builder.RegisterType<AliasesService>()
.WithProperty("MailService", new MailService())
.As<IAliasesService>();
Минимальный пример:
using Autofac;
namespace ConsoleApplication1
{
public interface IBar
{
}
public class Bar: IBar
{
public string Text { get; set; }
public Bar()
{
Text = "Hello world!";
}
}
public interface IFoo
{
}
public class Foo: IFoo
{
public IBar Bar { get; set; }
}
public class Program
{
public static void Main(string[] args)
{
var builder = new ContainerBuilder();
builder.RegisterType<Bar>().As<IBar>();
builder.RegisterType<Foo>().As<IFoo>().PropertiesAutowired();
var container = builder.Build();
var foo = container.Resolve<IFoo>();
}
}
}
Альтернативное решение:
Для минимального примера Autofac работает, но в контексте контроллеров мне все еще не удалось заставить его работать должным образом, поэтому я отказался от его использования, так как потратил слишком много времени. Сейчас я использую Castle Windsor, и он делает все, что мне нужно, спасибо за поддержку.
MailService
?MailService
илиIMailService
? - person Sriram Sakthivel   schedule 14.04.2015MailService
является собственностьюDbRespository
илиAliasesService
? (Я думаю, что это ошибка в вашем примере кода). Все испробованные решения должны работать. Не могли бы вы поделиться кодом ваших контроллеров и сервисов? (только конструктор и свойства) - person Cyril Durand   schedule 14.04.2015AliasesService
классом? - person Cyril Durand   schedule 14.04.2015