2012-08-10 49 views
3

試圖找到真正的原因,沒有太多的樂趣!城堡Scoped生活方式不起作用

Type is not resolved for member 'Castle.MicroKernel.Lifestyle.Scoped.CallContextLifetimeScope+SerializationReference,Castle.Windsor, Version=3.1.0.0, Culture=neutral, PublicKeyToken=407dd0808d44fbdc'. 

這看起來像一個錯誤,考慮到我沒有註冊使用這種生活方式的容器。

回答

1

我不知道你正在嘗試做的,但如果你的目標是實現一個IDependencyResolver(看起來像它,因爲你正在使用範圍):

如果要實現一個IDependencyResolver,不盡量聰明並繼承你的IDependencyScope實現。從頭開始創建解析器。這是我如何實現我的依賴解析器(工作):

public class WindsorDependencyResolver : IDependencyResolver { 
    private readonly IWindsorContainer _container; 

    public WindsorDependencyResolver(IWindsorContainer container) 
    { 
     _container = container; 
    } 

    public IDependencyScope BeginScope() 
    { 
     return new WindsorDependencyScope(_container); 
    } 

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

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     return _container.ResolveAll(serviceType).Cast<object>(); 
    } 

    public void Dispose() 
    { 
    } 
} 

public class WindsorDependencyScope : IDependencyScope { 
    private readonly IWindsorContainer _container; 
    private readonly IDisposable _scope; 
    private bool _disposed; 

    public WindsorDependencyScope(IWindsorContainer container) 
    { 
     _container = container; 
     _scope = _container.BeginScope(); 
    } 

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

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     EnsureNotDisposed(); 
     return _container.ResolveAll(serviceType).Cast<object>(); 
    } 

    public void Dispose() 
    { 
     if(_disposed) return; 

     _scope.Dispose(); 
     _disposed = true; 
     GC.SuppressFinalize(this); 
    } 

    private void EnsureNotDisposed() 
    { 
     if(_disposed) throw new ObjectDisposedException("WindsorDependencyScope"); 
    } 
} 

而且這是我第一次嘗試(其中產生的誤差):

public class WindsorDependencyResolver : WindsorDependencyScope, IDependencyResolver { 
    private readonly IWindsorContainer _container; 

    public WindsorDependencyResolver(IWindsorContainer container) 
     : base(container) 
    { 
     _container = container; 
    } 

    public IDependencyScope BeginScope() 
    { 
     return new WindsorDependencyScope(_container); 
    } 
} 
+0

好吧,我們在同一頁上100%,直到IDependencyResolver和IDependencyScope的實現。我仍試圖找出這個問題。它幾乎看起來像一個框架序列化問題,但我還沒有證明。 – 2012-08-12 15:49:44

+0

所以要清楚我仍然收到錯誤,使用容器的3.1。 – 2012-08-12 16:20:11

+0

在這一點上,也許我應該從另一個角度排除故障,因爲你沒有這個問題。所以在這裏我們去文件新項目LOL .. UGH ...有時寫代碼只是糟​​透了。 – 2012-08-12 16:26:08

2

面對同樣的問題,而這樣做的MSTest。加Castle.Windsor.dllGAC爲我工作。

gacutil.exe /if "C:\Castle.Windsor.3.1.0\lib\net40\Castle.Windsor.dll" 
+1

這也適用於我 - 我想知道爲什麼。這是一種解決方法,而不是我的永久解決方案。 – thebeekeeper 2013-06-14 17:15:41

+0

這僅發生在兩臺機器上。我記得它在執行一些Native到Managed Transition時會在nHibernate代碼中出現某處,反之亦然。 – SarkarG 2013-06-17 10:36:07

+0

是的,我看到的是同樣的東西。在我們的所有構建/集成服務器上向GAC添加Windsor對我來說不是一個好的解決方案,但我想它現在必須工作。 – thebeekeeper 2013-06-17 16:59:22