[英]WCF Proxy + DI (Ninject) + IDisposable
我有一個調用某些WCF服務的MVC4應用程序。
我閱讀了一些有關使用“使用”語法處理WCF代理時可能發生的問題的信息(請閱讀此... )。 我正在嘗試在我的解決方案中正確實現WCF代理處理( 現在是... )。
標准請求貫穿應用程序的以下各層:
MVC控制器>“主外觀”>“次要外觀”> WCF代理 (舊版代碼。不是我的錯)
我正在使用Ninject 3.2.2.0將依賴項自動注入這些層中。 例如:
控制器:
public class HomeController : Controller
{
private readonly SomeMainFacade _someMainFacade;
public HomeController(SomeMainFacade someMainFacade)
{
_someMainFacade = someMainFacade;
}
...
}
“主立面”:
public class SomeMainFacade
{
private readonly MinorFacade1 _minorFacade1;
private readonly MinorFacade2 _minorFacade2;
public SomeMainFacade (
MinorFacade1 minorFacade1,
MinorFacade2 minorFacade2
){
_minorFacade1 = minorFacade1;
_minorFacade2= minorFacade2;
}
...
}
“小門面”
public class MinorFacade1
{
private readonly IWCFService _wcfServiceClient;
public MinorFacade1(IWCFService wcfServiceClient)
{
_wcfServiceClient= wcfServiceClient;
}
...
}
我想正確處理“次要外觀”中使用的WCF服務,但是如果不進行大量重構,我想不出這種方法。 也許Ninject來救援了...
任何幫助表示贊賞。
謝謝。
這是我很久以前在一個遙遠的星系中寫的一類:
/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
public class RemotingClient<T> : IDisposable
{
private bool _disposed;
private readonly ChannelFactory<T> _factory;
/// <summary>
///
/// </summary>
public event OnCloseChannel ChannelClosed;
public event OnFaultedChannel ChannelFaulted;
/// <summary>
///
/// </summary>
public delegate void OnCloseChannel();
public delegate void OnFaultedChannel();
/// <summary>
///
/// </summary>
/// <param name="factory"></param>
public RemotingClient(ChannelFactory<T> factory)
: this(factory, SynchronizationContext.Current)
{
}
private void OnClose(object sender, EventArgs e)
{
if (null != ChannelClosed)
ChannelClosed();
}
private void OnFaulted(object sender, EventArgs e)
{
if (null != ChannelFaulted)
ChannelFaulted();
}
/// <summary>
///
/// </summary>
/// <param name="factory"></param>
/// <param name="context"></param>
public RemotingClient(ChannelFactory<T> factory, SynchronizationContext context)
{
Context = context;
_factory = factory;
CreateNewChannel();
}
/// <summary>
///
/// </summary>
/// <param name="uiCallback"></param>
public void PostToContext(SendOrPostCallback uiCallback)
{
Context.Post(uiCallback, null);
}
public void CreateNewChannel()
{
Channel = _factory.CreateChannel();
ICommunicationObject c = Channel as ICommunicationObject;
if (null == c)
throw new ArgumentException(
typeof(T) + " Can not be used as an ICommunicationObject");
c.Closed += OnClose;
c.Faulted += OnFaulted;
c.Open();
}
/// <summary>
///
/// </summary>
public SynchronizationContext Context
{ get; private set; }
/// <summary>
///
/// </summary>
public T Channel
{ get; set; }
public CommunicationState ChannelState
{
get
{
ICommunicationObject c = (ICommunicationObject)Channel;
return c.State;
}
}
#region IDisposable Members
/// <summary>
///
/// </summary>
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public void Dispose(bool disposing)
{
if (!this._disposed)
{
if (disposing)
Close();
this._disposed = true;
}
}
public void Close()
{
ICommunicationObject c = Channel as ICommunicationObject;
if (c.State == CommunicationState.Faulted)
c.Abort();
c.Close();
}
#endregion
}
然后基本上在某個地方創建一個靜態ChannelFactory(我想這將傳遞給您的minorfacade),然后調用RemotingClient。 像這樣:
public class MinorFacade1
{
private static ChannelFactory<IMyServiceContract> MyFactory{ get; set; }
public MinorFacade1(ChannelFactory<IMyServiceContract> factory)
{
MyFactory = factory;
}
public void DoSomeAwesomeWcfCall()
{
using(RemotingClient<IMyServiceContract> proxy = new RemotingClient<IMyServiceContract>(MyFactory)
proxy.Channel.ThisIsAnAwesomeWcfCall();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.