2013-07-27 87 views
3

只要我試圖解決我的UnitOfWork我得到這個錯誤:「該型IUnitOfWork不具有可訪問的構造函數」問題解決依賴使用Unity

但是,只有當我將unitOfWork的LifetimeManager設置爲PerResolveLifetimeManager時纔會發生這種情況。如果我只使用默認的,一切正常。 我的unitOfWork,確實有一個公共無參數的構造函數。 這是我的代碼:

//Global asax 
IUnityContainer unity = new UnityContainer(); 
unity.RegisterType<HomeController>(); 
unity.RegisterInstance<IUnitOfWork>(new UnitOfWork(), new PerResolveLifetimeManager()); 
ControllerBuilder.Current.SetControllerFactory(new IocControllerFactory(unity)); 

//IocControllerFactory 
public class IocControllerFactory : DefaultControllerFactory 
{ 
    private readonly IUnityContainer _container; 

    public IocControllerFactory(IUnityContainer container) 
    { 
     _container = container; 
    } 

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) 
    { 
     if (controllerType != null) 
      return _container.Resolve(controllerType) as IController; 
     else 
      return base.GetControllerInstance(requestContext, controllerType); 
    } 
} 

//Home controller constructor 
public HomeController(IUnitOfWork unitOfWork) 
{ 
} 
+0

有關Unity v3.5中自動註冊的完整示例,請參閱http://stackoverflow.com/questions/17168458/unity-autoregistration-convention-based-registration-unity/25654904#25654904。 – Contango

回答

3

您可以指定以下統一內置終身經理 類型中的一種或自定義的類型,當你調用RegisterInstance方法:

  1. ContainerControlledLifetimeManager
  2. ExternallyControlledLifetimeManager
  3. HierarchicalLifetimeManager

注:這是不恰當的使用無論是PerResolveLifetimeManagerTransientLifetimeManagerRegisterInstance因爲他們都在每次調用 創建一個新的實例來解決。

對於Unity 2.0中的official documentation,請查看使用Lifetime Manager和RegisterInstance方法一節。

3

RegisterInstance用於當你想用一個Container註冊一個已存在的對象時。每當有這種類型的請求時,返回同一個對象實例(而不是新對象)。默認情況下,RegisterInstance方法具有ContainerControlledLifetimeManager,它在Container的生命週期中管理一個實例。

對於PerResolveLifetimeManager,每次請求解析時,都會創建一個新的對象實例。

因此,當您嘗試將PerResolveLifetimeManager與RegisterInstance方法一起使用時,該錯誤將返回給您。