0

Castle(Nugetから)でApiControllersとControllers(webapiではない)の両方を使用するプロジェクトで作業しています

 internal class WebWindsorInstaller : IWindsorInstaller
    {
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            container.Register(Component
                .For<RepositoryFactories>()
                .ImplementedBy<RepositoryFactories>()
                .LifestyleSingleton());

            container.Register(Component
                .For<IRepositoryProvider>()
                .ImplementedBy<RepositoryProvider>()
                .LifestylePerWebRequest());

            container.Register(Component
                .For<IProjUow>()
                .ImplementedBy<ProjUow>()
                .LifestylePerWebRequest());

            container.Register(Classes
                .FromAssemblyContaining<Api.CategoriesController>()
                .BasedOn<IHttpController>()
                .If(t => t.Name.EndsWith("Controller"))
                .LifestylePerWebRequest());

            container.Register(Classes
                .FromAssemblyContaining<CategoriesController>()
                .BasedOn<IController>()
                .If(t => t.Name.EndsWith("Controller"))
                .LifestylePerWebRequest());
        }
    }

これは global.asax (Application_Start) にあります。

var container = new WindsorContainer().Install(new WebWindsorInstaller());
GlobalConfiguration.Configuration.DependencyResolver = new WindsorDependencyResolver(container);

そして、これは CategoriesController の Controller コンストラクターです

public class CategoriesController : ControllerBase
{
    public CategoriesController(IProjUow uow)
    {
        Uow = uow;
    }
}

そして ControllerBase は Controller を継承します

ApiController は次のように定義されます。

public abstract class ApiControllerBase : ApiController
{
    protected IProjUow Uow { get; set; }
}

public class CategoriesController : ApiControllerBase
{
    public CategoriesController(IProjUow uow)
    {
        Uow = uow;
    }
}

ApiController は正常に動作しますが、もう一方は次のように述べています。

このオブジェクトにはパラメーターなしのコンストラクターが定義されていません。

なんで?

前もって感謝します!ギレルモ。

4

2 に答える 2

0

わかりました、フィルのリンクは私を正しい方向に向けました。誰かが同じ問題を抱えている場合に備えて、私の解決策を共有します。

これは、Global.asax.cx (Application_Start メソッド) にある必要があります。

// Set the dependency resolver for Web API.
var webApicontainer = new WindsorContainer().Install(new WebWindsorInstaller());
GlobalConfiguration.Configuration.DependencyResolver = new WebApiWindsorDependencyResolver(webApicontainer);

// Set the dependency resolver for Mvc Controllers
Container = new WindsorContainer()
    .Install(new ControllersInstaller());
DependencyResolver.SetResolver(new MvcWindsorDependencyResolver(Container)); 
ServiceLocator.SetLocatorProvider(() => new WindsorServiceLocator(Container)); 
var controllerFactory = new WindsorControllerFactory(Container.Kernel); 
ControllerBuilder.Current.SetControllerFactory(controllerFactory); 

WebApiWindsorDependecyResolver

 internal class WebApiWindsorDependencyResolver : IDependencyResolver
    {
        private readonly IWindsorContainer container;

        public WebApiWindsorDependencyResolver(IWindsorContainer container)
        {
            if (container == null) { throw new ArgumentNullException("container"); }
            this.container = container;
        }

        public object GetService(Type t)
        {
            return this.container.Kernel.HasComponent(t) ? this.container.Resolve(t) : null;
        }

        public IEnumerable<object> GetServices(Type t)
        {
            return this.container.ResolveAll(t).Cast<object>().ToArray();
        }

        public IDependencyScope BeginScope()
        {
            return new ReleasingDependencyScope(this as IDependencyScope, this.container.Release);
        }

        public void Dispose()
        {
        }
    }

MvcWindsorDependencyResolver

 internal class MvcWindsorDependencyResolver : IDependencyResolver
    {
        private readonly IWindsorContainer container;

        public MvcWindsorDependencyResolver(IWindsorContainer container)
        {
            this.container = container;
        }

        public object GetService(Type serviceType)
        {
            return container.Kernel.HasComponent(serviceType) ? container.Resolve(serviceType) : null;
        }

        public IEnumerable<object> GetServices(Type serviceType)
        {
            return container.Kernel.HasComponent(serviceType) ? container.ResolveAll(serviceType).Cast<object>() : new object[] { };
        }
    }

コントローラーインストーラー

public class ControllersInstaller : IWindsorInstaller
    {
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            container.Register(FindControllers().Configure(c => c.LifestyleTransient()));

            container.Register(Component
                .For<RepositoryFactories>()
                .ImplementedBy<RepositoryFactories>()
                .LifestyleSingleton());

            container.Register(Component
                .For<IRepositoryProvider>()
                .ImplementedBy<RepositoryProvider>()
                .LifestylePerWebRequest());

            container.Register(Component
                .For<IProjUow>()
                .ImplementedBy<ProjUow>()
                .LifestylePerWebRequest());
        }

        private static BasedOnDescriptor FindControllers()
        {

            return AllTypes.FromThisAssembly()
                .BasedOn<IController>()
                .If(t => t.Name.EndsWith("Controller"));
        }
    }

WebWindsorInstaller

 internal class WebWindsorInstaller : IWindsorInstaller
    {
        public void Install(IWindsorContainer container, IConfigurationStore store)
        {
            container.Register(Component
                .For<RepositoryFactories>()
                .ImplementedBy<RepositoryFactories>()
                .LifestyleSingleton());

            container.Register(Component
                .For<IRepositoryProvider>()
                .ImplementedBy<RepositoryProvider>()
                .LifestylePerWebRequest());

            container.Register(Component
                .For<IProjUow>()
                .ImplementedBy<ProjUow>()
                .LifestylePerWebRequest());

            container.Register(Classes
                .FromAssemblyContaining<Api.CategoriesController>()
                .BasedOn<IHttpController>()
                .If(t => t.Name.EndsWith("Controller"))
                .LifestylePerWebRequest());
        }
    }

(これが機能しているにもかかわらず)うまくいかない唯一のことは、2つのクラスDependencyResolver(WebApiWindsorDependencyResolverとMvcWindsorDependencyResolver)がほぼ同じであるのに、なぜ必要なのかということです。それらの1つを取り除くことはできますか?

コードを変更し、代わりに

DependencyResolver.SetResolver(new MvcWindsorDependencyResolver(Container)); 

私は書きます

DependencyResolver.SetResolver(new WebApiWindsorDependencyResolver(Container)); 

それは言う

The type Proj.UI.Cms.Infrastructure.WebApiWindsorDependencyResolver does not appear to implement Microsoft.Practices.ServiceLocation.IServiceLocator.
Parameter name: commonServiceLocator

しかし、両方のクラスが同じコードを共有しているようです。

よろしくお願いします。ギレルモ。

于 2012-11-23T13:58:19.287 に答える