开发者

In a knot with Generics

开发者 https://www.devze.com 2022-12-08 12:18 出处:网络
I have the following domain object: public class DomainObject<T,TRepo> where T : DomainObject<T>

I have the following domain object:

public class DomainObject<T,TRepo> 
  where T : DomainObject<T>
  where TRepo : IRepository<T>
{
      public static TRepo Repository { get;private set; }
}

A reposit开发者_如何学Goory interface:

public interface IRepository<T> //where T : DomainObject<T> // The catch 22
{
    void Save(T domainObject);
}

An implementation of the 2:

public class User : DomainObject<User,MyRepository>
{
    public string Name { get;private set;}
}

public class MyRepository : IRepository<User>
{
    public List<User> UsersWithNameBob()
    {

    }
}

So adding another method that isn't inside IRepository.

I want to enforce the repository as an IRepository while above it could be any type.

A small sidenote: I'm writing this for small systems with very few domain objects. I'm not looking to create anything that uses IoC, but rather something that is easy and simple to consume.

Thanks


Your implementation of DomainObject is only specifying one generic type argument instead of two. Why isn't it:

public class User : DomainObject<User, MyRepository>
{
    public string Name { get;private set;}
}

If that doesn't work, could you explain in what way it doesn't do what you need?


Not exactly sure what you want, but something like this compiles:

public class DomainObject<T, TRepo> 
     where T: DomainObject<T, TRepo> 
     where TRepo: IRepository<T, TRepo>
{
     public static TRepo Repository
     {
         get;
         private set; 
     }
}

public interface IRepository<T, TRepo>
     where T: DomainObject<T, TRepo>
     where TRepo: IRepository<T, TRepo>
{
     void Save(T domainObject);
}
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号