これが可能かどうかわかりませんし、実装ごとに拡張メソッドを記述する必要があるかもしれません。いくつかのコード例を示します:インタフェースの正しい実装を返す拡張メソッド?
public interface IBaseService<T>
{
IUnitOfwork UnitOfWork {get;}
}
public interface IService<T>: IBaseService<T>
{
IEnumerable<T> GetAll();
T GetById(Guid id);
}
public interface IUserService: IService<User>
{
User FindByUsernameAndPassword(string username, string password)
}
public class BaseService<T>: IService<T>
{
public BaseService(IRepository<T> repository)
{
_repository = repository
}
public virtual IEnumerable<T> GetAll(){....};
public virtual T GetById(Guid id){....};
IUnitOfWork UnitOfWork {get {return _repository.UnitOfWork;}}
}
public class UserService: BaseService<User>, IUserService
{
...
}
public static class ServiceExtensions
{
public static IBaseService<T> EnableLazyLoading<T>(this IBaseService<T> service, bool lazyLoad = True)
{
service.UnitOfWork.EnableLazyLoad(lazyLoad);
return service;
}
}
だから、私はUserServiceを使っています。私はUserServiceの上の拡張メソッドを呼び出すと、それはそれはIBaseServiceの適切な実装を返すか、私はそれぞれの実装のために作成し、拡張メソッドをする必要がありますすることが可能です?:
例:
userService.EnableLazyLoading(false).FindByUsernameAndPassword("ddivita","123456")
それで、明確にするために、それが呼び出されたものは何でも新しいバージョンを作成したいと言っていますか? –
私は、IBaseServcieのすべての実装で使用される1つの拡張メソッドを書いて、正しい実装を返すことを望みます。私の例では、EnableLazyLoading拡張を呼び出すときにIUserServiceを返す方法を理解したいと思います。 –
DDiVita
ああ!私は、それが呼び出された特定の型を返すようにしたいので、その新しいインスタンスを作成しません。 –