2013-05-19 16 views
0

最大數:一個無參數和一個與幾個參數。爲什麼叫控制器的參數的構造函數,而不是一個與我有一個網站,asp.net MVC解決方案</p> <p>我的控制器有2個構造函數的參數

用於使用參數穿過ctor的代碼,使用Unity容器將它們注入到DI中。

我已將我的網站合併到另一個網站中。

現在我的控制器通過無參數ctor初始化。

我錯過了什麼? 我的代碼:

執行初始化程序代碼。

public static class Initializer 
{ 
    private static bool isInitialize; 
    private static readonly object LockObj = new object(); 
    private static IUnityContainer defaultContainer = new UnityContainer(); 

    static Initializer() 
    { 
     Initialize(); 
    } 

    public static void Initialize() 
    { 
     if (isInitialize) 
      return; 

     lock (LockObj) 
     { 
      IUnityContainer container = defaultContainer; 

      //registering Unity for web API 
      GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container); 
      //registering Unity for MVC 
      DependencyResolver.SetResolver(new UnityDependencyResolver(container)); 

      container.RegisterType<ICritieriaLoader, CritieriaLoader>(); 
      container.RegisterType<IAppsLoader, AppsLoader>(); 
      container.RegisterType<ISaveTestToBD, SaveTestToDB>(); 
      container.RegisterType<ITestOperations, TestOperations>(); 


      container.RegisterType<IServicesManager, ServicesManager>(); 
      container.RegisterType<IMamConfigurationManager, MamConfigurationsManager>(); 
      container.RegisterType<IAppsDataManager, AppsDataManager>(); 
      container.RegisterType<IMamConfiguration_V1Manager, MamConfiguration_V1Manager>(); 
      container.RegisterType<ICtidProd_V1Manager, CtidProd_V1Manager>(); 
      container.RegisterType<ICtidsAliasManager, CtidsAliasManager>(); 


      container.RegisterType<IDalFactory, DalFactory>(); 
      container.RegisterType<IDal<AppsDataBl>, AppsDataDal>(); 
      container.RegisterType<IApplicationLogger, Log4NetLogger>(); 
      container.RegisterType<IDal<MamConfigurationBL>, MamConfigurationBlDal>(); 
      container.RegisterType<IDal<Conduit.Mam.MaMDBEntityFramework.MamConfiguration>, MamConfigurationDal>(); 
      container.RegisterType<IDal<AddServiceBL>, NewService>(); 


      container.RegisterType<IAlias_V1UiToEfConvertor, Alias_V1UiToEfConvertor>(new ContainerControlledLifetimeManager()); 
      container.RegisterType<IMamConfiguration_V1UiToEfConvertor, MamConfiguration_V1UiToEfConvertor>(new ContainerControlledLifetimeManager()); 
      container.RegisterType<ICtidProdValidator, CtidPRodValidator>(new ContainerControlledLifetimeManager()); 
      container.RegisterType<IGeoProdValidator, GeoProdValidator>(new ContainerControlledLifetimeManager()); 
      container.RegisterType<IConstListsProvider, ConstListsProvider>(new ContainerControlledLifetimeManager()); 
      container.RegisterType<IEntityToUiConvertor, EntityToUiConvertor>(); 

      if (!isInitialize) 
      { 
       isInitialize = true; 
      } 
     } 
    } 
} 

protected void Application_Start() 
    { 
     Log.Application.Warn("Application started", "Application started"); 

     WebApiConfig.Configure(GlobalConfiguration.Configuration); 

     AreaRegistration.RegisterAllAreas(); 

     FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 

     RouteConfig.RegisterRoutes(RouteTable.Routes); 

     BundleConfig.RegisterBundles(BundleTable.Bundles); 

     Initializer.Initialize(); 

[Authorize] 
public class CtidProdController : SAPController 
{ 

    #region Members 

    private IApplicationLogger mApplicationLog { get; set; } 

    //private IMamConfiguration_V1Manager mMamConfigurationManager { get; set; } 

    private ICritieriaLoader mCritieriaLoader { get; set; } 

    private IAppsLoader mAppsLoder { get; set; } 

    private IMamConfiguration_V1UiToEfConvertor mMamConfiguration_V1UiToEfConvertor { get; set; } 

    private CtidProdModel mCtidProdModel { get; set; } 

    private IConstListsProvider mConstListsProvider { get; set; } 

    private ICtidProd_V1Manager mCtidProd_V1Manager { get; set; } 

    private ICtidsAliasManager mCtidsAliasManager { get; set; } 


    #endregion 


    #region CTOR 

    public CtidProdController() 
    { 

    } 


    public CtidProdController(IApplicationLogger logger, ICtidProd_V1Manager ctidProd_V1Manager, 
     ICritieriaLoader critieriaLoader, IAppsLoader appsLoder, IMamConfiguration_V1UiToEfConvertor mamConfiguration_V1UiToEfConvertor, 
     IConstListsProvider constListsProvider, ICtidsAliasManager ctidsAliasManager) 
    { 
     mApplicationLog = logger; 

     mCtidProd_V1Manager = ctidProd_V1Manager; 

     mCritieriaLoader = critieriaLoader; 

     mAppsLoder = appsLoder; 

     mMamConfiguration_V1UiToEfConvertor = mamConfiguration_V1UiToEfConvertor; 

     mConstListsProvider = constListsProvider; 

     mCtidsAliasManager = ctidsAliasManager; 

     FillModel(mConstListsProvider); 
    } 

    #endregion 
    } 

新網站代碼:注入代碼:

public class NinjectDependencyScope : IDependencyScope 
{ 
    private IResolutionRoot resolver; 

    internal NinjectDependencyScope(IResolutionRoot resolver) 
    { 
     Contract.Assert(resolver != null); 

     this.resolver = resolver; 
    } 

    public void Dispose() 
    { 
     IDisposable disposable = resolver as IDisposable; 
     if (disposable != null) 
      disposable.Dispose(); 

     resolver = null; 
    } 

    public object GetService(Type serviceType) 
    { 
     if (resolver == null) 
      throw new ObjectDisposedException("this", "This scope has already been disposed"); 

     return resolver.TryGet(serviceType); 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     if (resolver == null) 
      throw new ObjectDisposedException("this", "This scope has already been disposed"); 

     return resolver.GetAll(serviceType); 
    } 
} 

public class NinjectDependencyResolver : NinjectDependencyScope, IDependencyResolver 
{ 
    private IKernel kernel; 

    public NinjectDependencyResolver(IKernel kernel) 
     : base(kernel) 
    { 
     this.kernel = kernel; 
    } 

    public IDependencyScope BeginScope() 
    { 
     return new NinjectDependencyScope(kernel.BeginBlock()); 
    } 
} 
+1

你需要更具體。你能添加一些代碼片段嗎? – Chris

+0

聽起來像你的DI無法解析構造函數中的所有參數,因此它正在擊中它可以解析的構造函數(0個參數)。發佈一些代碼。 –

+0

@DarrenDavies添加了一些代碼 –

回答

0

像達倫·戴維斯指出你可能缺少的某些屬性。實際上,默認情況下Unity會使用參數最多的構造函數,但要確保如果您有多個ctor,則應使用InjectionConstructor屬性修飾所需的值。 希望這有助於。 親切的問候

+0

但正如我所說的,它曾用於我以前的sln工作 –

+0

您的CtidProdController類在合併之前是否繼承了SAPController類? – pasty

+0

不,你認爲這可能有什麼關係? –

相關問題