Pregunta

He hecho algunas preguntas relacionadas con esto, pero aún no tenemos respuestas concluyentes, así que aquí hay una pregunta más simple.

Considerar esto.Tengo 2 interfaces.Uno describe un dao.Una es una interfaz WCF.La interfaz WCF hereda la interfaz DAO para exponer sus métodos con los atributos WCF.Debido a que es una interfaz WCF, por supuesto, debo declarar nuevamente los métodos para colocar los atributos WCF sobre ellos, como [OperationContract].Como resultado, estoy en efecto ocultando los métodos de las interfaces anteriores y debe colocar la palabra clave 'nueva' en ellos.Es esto lo correcto para hacer en esta situación.Necesito poder presentar los métodos de la interfaz DAO a través de la interfaz WCF, por lo tanto, la razón de heredarla.Quiero forzar la interfaz WCF para que se expongan estas funciones.Parece que mis manos están bastante atadas y que debo usar este enfoque para poder obtener los métodos expuestos, pero ¿qué piensas?

En términos de código, se vería así:

//The dao interface
public interface IMyDao
{
    void Foo();
}

//The wcf interface which implements/extends the IMyDao interface in order to add wcf attributes
[ServiceContract]
public interface IMyWCF : IMyDao
{
    [OperationContract]
    new void Foo();
}

//The dao class that implements the dao interface
public class MyDao : IMyDao
{
    public void Foo()
    {
        //Do something
    }
}

//The class implements the wcf interface. Makes calls to the dao.
public class MyWCF : IMyWCF
{
    public void Foo()
    {
        MyDao myDao = new MyDao();

        myDao.Foo();  
    }
}

¿Fue útil?

Solución

Use 2 interfaces: no comparta una interfaz para un DAO y un contrato WCF

Incluya una envoltura que pase a través de las llamadas de servicio WCF al DAO.

Así, por ejemplo, si su DAO tiene el siguiente método:

public interface IMyDAO
{
    MyObject GetMyObjectById(int Id);
}

Tendrías su contrato de operación con la misma firma:

public interface IMyWCFContract 
{
    [OperationContract]
    MyObject GetMyObjectById(int Id);
}

y luego tendrías una clase de envoltura:

public class MyWCFService : IMyWCFContract
{
     private MyDAO dao;

     public MyWCFService()
     {
        dao = new MyDAO(); 
     }

     public MyObject GetMyObjectById(int id)
     {
        return dao.GetMyObjectById(id);
     }
}

Un plan alternativo puede ser considerar usando un servicio restante en su lugar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top