我有一个MVC应用程序,并将我的存储库注入我的控制器,这是正常的。 另外,我的解决方案中有一个Webservice,它使用完全相同的存储库,但是当我调用我的Web服务时,我的存储库属性为null。
我按以下方式注册我的存储库:
container.Register(Classes.FromAssembly(Assembly.GetAssembly(typeof(HdtRepository))).InSameNamespaceAs<HdtRepository>().WithService.DefaultInterfaces().LifestyleTransient());
我的资源库属性如下:
public IUserRepository _userRepo { get; set; }
public IHdtRepository _hdtRepo { get; set; }
public ITimeRecordRepository _timeRepo { get; set; }
有人能告诉我为什么存储库没有注入我的网络服务吗?
现在我将以下内容添加到我的webservice的构造函数中:
public MyWebservice()
{
_userRepo = MvcApplication.container.Resolve<IUserRepository>();
_hdtRepo = MvcApplication.container.Resolve<IHdtRepository>();
_timeRepo = MvcApplication.container.Resolve<ITimeRecordRepository>();
_locationRepo = MvcApplication.container.Resolve<ILocationRepository>();
_wayRepo = MvcApplication.container.Resolve<IWayPointRepository>();
_wayDataRepo = MvcApplication.container.Resolve<IWayDataRepository>();
}
但据我所知,这实际上是一个反模式。 我对所有IoC的东西都是新手,所以有人可以告诉我问题出在哪里。
干杯, 斯蒂芬
答案 0 :(得分:0)
首先让我们与一些Windsor安装程序一起设置项目。它们在大多数情况下都是这样的。
public class ServiceInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component.For<IEncryptionService().ImplementedBy<EncryptionService>());
}
}
在App_Start文件夹中添加一个名为ContainerConfig.cs的类,看起来像这样。
public class ContainerConfig
{
private static IWindsorContainer _container;
public static IWindsorContainer ConfigureContainer()
{
_container = new WindsorContainer();
_container.Install(FromAssembly.This()).Install(FromAssembly.Named("Project.Dependency"));
_container.Kernel.Resolver.AddSubResolver(new CollectionResolver(_container.Kernel, true));
_container.AddFacility<TypedFactoryFacility>();
var controllerFactory = new WindsorControllerFactory(_container.Kernel);
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
return _container;
}
}
请注意,我有一个单独的项目用于我的依赖注入因此_container.Install(FromAssembly.This())。Install(FromAssembly.Named(“Project.Dependency”)); line ...你可以删除后者.Install(FromAssembly)部分。
在您的Global.asax中,您可以执行以下操作:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
ContainerConfig.ConfigureContainer();
}
现在,您可以在控制器中执行此操作:
public class TempController : Controller
{
private readonly IEncryptionService _encryptionService;
public TempController(IEncryptionService encryptionService )
{
_encryptionService = encryptionService;
}
public ActionResult Index()
{
// Example of calling a method on the encryption service.
string hash, salt;
_encryptionService.GethashAndSaltString("I Need Some Loving", out hash, out salt);
return View();
}
}
如果您使用构造函数注入,请告诉我。解决这个问题将是一个很大的帮助,你将不会使用属性注入。一旦我们解决了所有这些问题,我们就可以查看您的webervice问题。
答案 1 :(得分:0)
我想这是不可能的,因为我已经阅读了其他一些帖子。 问题是您无法为控制器的“WindsorControllerFactory”等Web服务创建自定义工厂。 我打算切换到WCF服务。
Resolve a System.Web.Services.WebService instance with Castle (for AOP purposes)