Мне нужно сделать общие методы для моих сервисов и использовать репозиторий или другое в зависимости от типа объекта, который я передаю как аргумент.Использование общих классов с впрыском зависимостей с C#
К примеру, у меня есть эти интерфейсы:
public interface IServiceText
{
Task<string> UpdateTextPosition(TextDto object);
Task<string> UpdateTextSize(TextDto object);
Task<string> UpdateOtherThingOnText(TextDto object);
}
public interface IServiceImage
{
Task<string> UpdateImagePosition(ImageDto object);
Task<string> UpdateImageSize(ImageDto object);
Task<string> UpdateOtherThingOnImage(ImageDto object);
}
В руке порядка, у меня есть классы, которые реализуют интерфейсы (добавлены только важный код) и с конструкторами:
//Class ServiceImage
private readonly IRepository<Image> _repo;
public ServiceImage(IRepository<Image> repo) //Dependecy Injection of the IRepository Generic
{
_repo = repo;
}
//Class ServiceText
private readonly IRepository<Text> _repo;
public ServiceText(IRepository<Text> repo) //Dependecy Injection of the IRepository Generic
{
_repo = repo;
}
UpdateTextPosition и UpdateImagePosition выполняют точно то же самое, но в разных сборниках (или используя разные экземпляры IRepository, я использую MongoDB):
public async Task<string> UpdateTextPosition(TextDto object)
{
var text = await _repo.FindAsync(object.Id);
text.PosLeft = object.PosLef;
text.PosRight = object.PosRight;
await _repo.Update(text);
return text.Id;
}
public async Task<string> UpdateImagePosition(ImageDto object)
{
var image = await _repo.FindAsync(object.Id);
image.PosLeft = object.PosLef;
image.PosRight = object.PosRight;
await _repo.Update(image);
return image.Id
}
EDIT: (добавлено ImageDto и TextDto)
public class ImageDto
{
public ObjectId Id {get; set;}
public int PosLeft {get; set;}
public int PosTop {get; set;}
public ICollection<string> PropertyImage1 {get; set;}
public string PropertyImage2 {get; set;}
}
public class TextDto
{
public ObjectId Id {get; set;}
public int PosLeft {get; set;}
public int PosTop {get; set;}
public double PropertyText1 {get; set;}
public string PropertyText2 {get; set;}
}
public class Image : Entity
{
public ObjectId Id {get; set;}
public int PosLeft {get; set;}
public int PosTop {get; set;}
public ICollection<string> PropertyImage1 {get; set;}
public string PropertyImage2 {get; set;}
public string OtherPropertyImage {get; set;}
}
public class Text : Entity
{
public ObjectId Id {get; set;}
public int PosLeft {get; set;}
public int PosTop {get; set;}
public double PropertyText1 {get; set;}
public string PropertyText2 {get; set;}
public string OtherPropertyText {get; set;}
}
И IEntity:
/// <summary>
/// Generic Entity interface.
/// </summary>
/// <typeparam name="TKey">The type used for the entity's Id.</typeparam>
public interface IEntity<TKey>
{
/// <summary>
/// Gets or sets the Id of the Entity.
/// </summary>
/// <value>Id of the Entity.</value>
[BsonId]
TKey Id { get; set; }
}
/// <summary>
/// "Default" Entity interface.
/// </summary>
/// <remarks>Entities are assumed to use strings for Id's.</remarks>
public interface IEntity : IEntity<string>
{
}
И класс Entity:
/// <summary>
/// Abstract Entity for all the BusinessEntities.
/// </summary>
//[DataContract]
[Serializable]
[BsonIgnoreExtraElements(Inherited = true)]
public abstract class Entity : IEntity<string>
{
/// <summary>
/// Gets or sets the id for this object (the primary record for an entity).
/// </summary>
/// <value>The id for this object (the primary record for an entity).</value>
[DataMember]
[BsonRepresentation(BsonType.ObjectId)]
public virtual string Id { get; set; }
}
мне нужнопереместите «общие методы» в новый CommonService с интерфейсом (ICommonService), и возьмите тип объекта и определите, что использует IMongoRepository ... Я думаю, что Generic - это мой способ ... но я прочитал об этом , но я не очень хорошо понимаю примеры, и я хотел бы наилучшим образом реализовать это в своем реальном решении.
Thank you soooo много !!
Другие методы также выглядят одинаково (например, «UpdateOtherThingOnText» и «UpdateOtherThingOnImage»)? или только методы, которые вы предоставили? Можете ли вы показать определение 'ImageDto' и' TextDto'? –
@YacoubMassad Привет!Я добавил класс ImageDto и TextDto :) Nop, другие методы совершенно разные. – chemitaxis
Итак, вы хотите создать службу, которая имеет один метод, называемый «UpdatePosition», который работает как на «ImageDto», так и «TextDto» и, возможно, на других DTO, не так ли? –