Windsor webservice注入属性

时间:2013-12-28 22:06:17

标签: asp.net-mvc-4 castle-windsor

我有一个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的东西都是新手,所以有人可以告诉我问题出在哪里。

干杯, 斯蒂芬

2 个答案:

答案 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)