如何在接口中包装对象

本文关键字:包装 对象 接口 | 更新日期: 2023-09-27 18:18:37

我有一个接口

public interface ICallFlowApplication
{
    void HandleCall();
}

和实现

 public class TestCallFlowApplication : ICallFlowApplication
 {
    public void HandleCall()
    {
        // blah blah

现在由于某种原因,我需要传递一个对象给方法,所以

    public void HandleCall(SipChannel channel)
    {

我认为我必须重构接口ICallFlowApplication

public interface ICallFlowApplication
{
    void HandleCall(SipChannel channel);
}

但是SipChannel是一个特殊的通道。有不同的渠道。我想在这里使用依赖注入。我的问题:

  1. 如何重写我的接口ICallFlowApplication ?
  2. 是否需要新建接口,如IChannel ?
  3. 如果有,有哪些细节?(示例代码)

如何在接口中包装对象

使用泛型-

    public interface ICallFlowApplication<T> where T : IChannel
    {
        void HandleCall(T channel);
    }
    public class TestCallFlowApplication : ICallFlowApplication<SipChannel>
    {
       public void HandleCall(SipChannel channel){}
    }
    public class SipChannel : IChannel {}
    public interface IChannel {}

下面是一个在你自己的对象中包装SipChannel并继承channel的例子——

    public interface ICallFlowApplication<T> where T : IChannel
    {
        void HandleCall(T channel);
    }
    public class TestCallFlowApplication : ICallFlowApplication<MySipChannel>
    {
        public void HandleCall(MySipChannel channel){}
    }
    public class MySipChannel : IChannel 
    {
        private SipChannel _channel;
        public MySipChannel(SipChannel channel)
        {
            _channel = channel;
        }
        // expose methods/properties you need
    }
    public interface IChannel {}
    public class SipChannel {} // declared in some unknown dll

这里有一种方法,它可能适合也可能不适合您的需要。

正如Tom a所说,最好的办法是创建一个IChannel接口,并将其封装在第三方提供的通道上。如果您必须对这些通道做一些事情,您可以在您的接口中指定它,并根据每个供应商的具体情况分别为每个通道实现它。

public interface IChannel
{
    void DoSomething();
    string DoSomethingElse();
}
public class SipChannel : IChannel
{
    public void DoSomething()
    {
        //go do some stuff
    }
    public string DoSomethingElse()
    {
        return "I did some stuff for you.";
    }
}
public OtherChannel : IChannel
{
    public void DoSomething()
    {
        //go do some stuff
    }
    public string DoSomethingElse()
    {
        return "I'm not sure what this one does yet.";
    }
}

现在,HandleCall可以有签名:void HandleCall(IChannel channel);

并实现如下:

public void HandleCall(IChannel channel)
{
    channel.DoSomething();
    channel.DoSomethingElse();
}

,它将调用传入的特定实例的实现。