none
Problema con fomulario genérico RRS feed

  • Pregunta

  • Tengo un proyecto en C# con Entity Framework en capas, y definí una clase abstracta LibDatos<T> : where T:EntityObject que implementa toda la funcionalidad CRUD de las entidades. Por cada entidad defino una EntityDao (por ej, CategoryDao) la cual deriva de LibDatos<T> (siguiendo el ej. anterior, public class CategoryDao : LibDatos<Category>) para mi capa de datos. También tengo definida en mi capa de negocios un EntityBo por cada entidad, la cual deriva de CategoryDao. En mi capa de presentación tengo un form genérico llamado CRUDform, el cual implementa la funcionalidad en común para todos mis ABM mediante una propiedad que declaro de tipo LibDatos<EntityObjec> (concretamente LibDatos<EntityObject> handler;). El problema surje cuando creo un nuevo form que deriva de mi CRUDform e intento instanciar mi propiedad handler. Cuando hago handler = new CategoryBo();, visual studio me informa que no puede convertir implícitamente CategoryBo a LibDatos<EntityObject> y no sé cómo resolverlo. Seguramente estoy haciendo algo mal, ya que soy bastante nuevo en todo esto. Quedo al aguardo de sus comentarios para intentar alguna salida. Muchas gracias,
    domingo, 7 de noviembre de 2010 15:17

Todas las respuestas

  • Hola,

    Lo que intentas hacer no sería handler = new CategoryDao(); en vez de handler = new CategoryBo();?

    Si fuera el caso, y aún así persiste el error, podrías hacer lo siguiente:

    handler = new CategoryDao() as LibDatos<EntityObject>;

    Saludos,

    JAReyes.


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solucion de esta pregunta te ha sido útil.
    domingo, 7 de noviembre de 2010 18:56
  • Hola,

    Acabo de probar lo que mencionas pero continúa arrojando el error "No puede convertir....". Creo que puedo llegar a tener algún problema de conceptos en cuanto a lo que quiero implementar (Base de Datos <-> Entity Framework <-> Capa de Datos <-> Capa de Negocios <-> Capa de Presentación). Muchas gracias igualmente,

     

    Walter Ferrero

    domingo, 7 de noviembre de 2010 21:28
  • Hola de nuevo,

    Quizas deberías pensar en trabajar con interfaces. De este modo podrías crear una interface ILibDatos<T> : where T:EntityObject que sirva de contrato para todo tu sistema de herencia. Esta clase base definiría todos los métodos que actualmente define tu clase base. A continuación declararias tu clase base del siguiente modo LibDatos<T> : ILibDatos<T> where T:EntityObject.

    De este modo, puedes definir tu propiedad en el form del siguiente modo:

    ILibDatos<EntityObject> handler;

    Y entonces, en tu form derivado ya podrias hacer handler = new CategoryDao() as ILibDatos<EntityObject>;

    Saludos,

    JAReyes.


    Please remember to Vote & "Mark As Answer" if this post is helpful to you.
    Por favor, recuerda Votar y "Marcar como respuesta" si la solucion de esta pregunta te ha sido útil.
    domingo, 7 de noviembre de 2010 22:23
  • Amigo, lamento comunicarte que así es como lo tengo definido. Tengo justamente una interface que define toda la funcionalidad y la clase LibDatos<T> que implementa esa interfaz como bien lo mencionas. A su vez, para mi entidad Category tengo lo siguiente:

    • Para mi capa de datos:
    public class CategoryDao : LibDatos<Category>
    {
    }
    • Para mi capa de negocios:
    public class CategoryBo : CategoryDao
    {
    }
    • y en mi form base, una propiedad de tipo LibDatos<EntityObject> handler;
    El problema lo tengo cuando en mi formulario concreto de categorías hago lo siguiente:

    handler = new CategoryBo();  acá es donde V. Studio me informa que no puede convertir impícitamente....

    Creo que el problema viene dado porque la propiedad que declaro en mi form base es de tipo genérica. También intenté lo siguiente:

    handler = (LibDatos<EntityObject>)Activator.CreateInstance(typeof(CategoryBo)); pero también arroja el error: 

    "System.InvalidCastException was unhandled
      Message=Unable to cast object of type 'PruebaEF.Negocios.CategoryBo' to type 'PruebaEF.Datos.LibDatos`1[System.Data.Objects.DataClasses.EntityObject]'.

    Espero que puedas continuar ayudándome a ver si le encontramos la salida. Muchas gracias,


    Walter Ferrero

    lunes, 8 de noviembre de 2010 22:49
  • Hola de nuevo,

    Esto a mi me esta compilando perfectamente:
     

    public interface ILibDatos<T> where T : EntityObject
    {
    }


    public class LibDatos<T> : ILibDatos<T> where T : EntityObject
    {
    }
     

    public class CategoryDao : LibDatos<Customers>
    {
    }


    public class CategoryBo : CategoryDao
    {
    }


    public class BaseFrom
    {
       protected ILibDatos<EntityObject> handler;
    }


    public class MyForm : BaseFrom
    {
       public MyForm()
       {
          base.handler = new CategoryDao() as ILibDatos<EntityObject>;
       }
    }


    Saludos,

    JAReyes.

    • Propuesto como respuesta JA Reyes lunes, 15 de noviembre de 2010 12:21
    jueves, 11 de noviembre de 2010 14:17
  • Hola nuevamente. Muchas gracias por tu ayuda. Ya logré resolverlo. No exactamente como indicas, pero casi... 

    *** Capa de Datos

    public interface ILibDatos<T>
    {
    }


    public class LibDatos<T> : ILibDatos<T> where T : EntityObject
    {
    }

    public class CategoryDao : LibDatos<Category> 
    {
    }

    *** Capa de Negocios

    public interface ILibBusiness<T> : ILibDatos<T>

    {
    }

    public class LibBusiness<T> : ILibBusiness<T> where T : EntityObject

    {

    private LibDatos<T> entityDao = new Libdatos<T>();

    ...

    }

     

    public class CategoryBo : ILibBusiness<Category>

    {
    }

     

    *** Capa de Presentación

    *** Form base

    public partial class FormCRUDBase<T> : Form

            where T : EntityObject

    {

    ILibBusiness<T> handller;

    }

     

    *** Clase intermedia para que compile

    public class Class1 : FormCRUDBase<Category>

        {

        }

     

    *** Form concreto

     public partial class frmABMCategorias : Class1

        {

    public frmABMCategorias()

    {

    handler = new CategoryBo();

    }

        }

     

    Saludos,

     

    Walter Ferrero

    • Propuesto como respuesta JA Reyes lunes, 15 de noviembre de 2010 12:21
    lunes, 15 de noviembre de 2010 12:14