Добавить автоматически сгенерированное поле и значение в базу данных - PullRequest
1 голос
/ 16 февраля 2020

Я работаю над программой, в которой мне нужно добавить автоматически сгенерированное поле и значение в мою базу данных. Итак, чтобы выразить это в контексте, у меня есть программа, в которой я могу выполнять обычные операции CRUD, и это связано с использованием чванства. У меня есть таблица ваучеров, где я хочу автоматически сгенерированное текстовое поле, для которого у меня есть код, и я хочу иметь возможность вводить сумму, и оно автоматически заполняет поля в базе данных. Код выглядит следующим образом:

Мой контроллер ваучеров:

    [Route("[controller]")]
[ApiController]
public class VouchersController : ControllerBase
{
    private readonly ComicStockContext _context;

    private IVoucherService _voucherService;

    public VouchersController(ComicStockContext context, IVoucherService voucherService)
    {
        _context = context;
        _voucherService = voucherService;
    }

    // GET: api/Vouchers
    [HttpGet]
    public IEnumerable<Vouchers> GetAllVouchers([FromQuery] int page)
    {
        return _voucherService.GetAllVouchers(page);
    }

    [HttpGet("generate")]
    // code to insert amount and generated string needs to go here

Мой интерфейс для обслуживания ваучеров:

    namespace BusinessLogic.ServicesInterfaces
{
    public  interface IVoucherService
    {
        IEnumerable<Vouchers> GetAllVouchers(int page);

        Vouchers FindVoucherByID(int voucherID);

        void InsertVoucher(Vouchers vouchers);


    }
}

Мой сервис ваучеров

    public class VoucherService: IVoucherService
{
    private IVoucherRepository _voucherRepository;

    public VoucherService(IVoucherRepository voucherRepository)
    {
        _voucherRepository = voucherRepository;
    }


    public IEnumerable<Vouchers> GetAllVouchers(int page)
    {
        return _voucherRepository.GetAllVouchers(page);
    }

    public Vouchers FindVoucherByID(int voucherID)
    {
        return _voucherRepository.FindVoucherByID(voucherID);
    }

    public void InsertVoucher(Vouchers vouchers)
    {
        _voucherRepository.InsertVoucher(vouchers);
    }

    public void InsertGeneratedVoucher(string vouchercode, int amount)
    {
         String GetVoucherNumber()
        {
            int size = 20;
            StringBuilder builder = new StringBuilder();
            Random random = new Random();
            char ch;
            for (int i = 0; i < size; i++)
            {
                ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
                builder.Append(ch);
            }

            return builder.ToString();
        }
        vouchercode = GetVoucherNumber();
        //_voucherRepository.InsertGeneratedVoucher(vouchercode, amount);
    }
}

Мой репозиторий ваучеров

    public class VoucherRepository: GenericRepository<Vouchers>, IVoucherRepository
{
    public VoucherRepository(): base()
    {
    }

    public VoucherRepository(ComicStockContext comicStockContext) : base(comicStockContext)
    {
    }

    public Vouchers FindVoucherByID(int voucherID)
    {
        return GetById(voucherID);
    }

    public IEnumerable<Vouchers> GetAllVouchers(int page)
    {
        return GetAll(page);
    }

    public void InsertVoucher(Vouchers vouchers)
    {
        Insert(vouchers);
    }
}
}

Мой интерфейс для репозитория ваучеров

{
public interface IVoucherRepository
{
    IEnumerable<Vouchers> GetAllVouchers(int page);

    Vouchers FindVoucherByID(int voucherID);

    void InsertVoucher(Vouchers vouchers);

И мой базовый репозиторий c

{
public class GenericRepository<T> : IGenericRepository<T> where T : class
{
    protected ComicStockContext _context = null;
    protected DbSet<T> table = null;

    public GenericRepository()
    {
        this._context = new ComicStockContext();
        table = _context.Set<T>();
    }

    public GenericRepository(ComicStockContext context)
    {
        _context = context;
        table = _context.Set<T>();
    }

    public IEnumerable<T> GetAll(int page)
    {
        return table.ToList().Skip(25 * page).Take(25);
    }
    public T GetById(object id)
    {
        return table.Find(id);
    }
    public void Insert(T obj)
    {
        table.Add(obj);
        Save();
    }
    public void Update(T obj)
    {
        table.Attach(obj);
        _context.Entry(obj).State = EntityState.Modified;
        Save();
    }
    public void Delete(object id)
    {
        T existing = table.Find(id);
        table.Remove(existing);
    }
    public void Save()
    {
        _context.SaveChanges();
    }



}
}

, а также интерфейс для хранилища generi c

    public interface IGenericRepository<T> where T : class
{
    IEnumerable<T> GetAll(int page);
    T GetById(object id);
    void Insert(T obj);
    void Update(T obj);
    void Delete(object id);
    void Save();
}

Таким образом, в основном код, который я пытаюсь достичь, я должен быть в состоянии вставить сумму, используя сваггер, например, 100 долларов, и он должен вставить 100 долларов в мой таблица ваучеров вместе с автоматически сгенерированной строкой, а остальные поля должны просто заполняться как Null.

1 Ответ

1 голос
/ 17 февраля 2020

У вас есть метод для генерации кода ваучера, хороший или плохой, так в чем же проблема? Является ли это структура, которую кто-то еще изложил, которую вы еще не совсем поняли, потому что в то время как общие шаблоны репозитория c, как это, довольно анемичны c, из того, что я вижу, ваш код составляет 90%:

public void InsertGeneratedVoucher(int amount)
{
    // TODO: Assert that your Amount is valid.. For instance can it be 0? <0??

    string GetVoucherNumber()
    {
        int size = 20;
        StringBuilder builder = new StringBuilder();
        Random random = new Random();
        char ch;
        for (int i = 0; i < size; i++)
        {
            ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
            builder.Append(ch);
        }
        // TODO: Check for duplicates?
        return builder.ToString();
    }
    var voucher = new Vouchers
    {
        Vouchercode = GetVoucherNumber();
        Amount = amount; 
    };
    _voucherRepository.Insert(voucher);
}

Нет смысла принимать код ваучера, если вы хотите, чтобы этот метод генерировал новый. Если вы хотите вернуть его, используйте возвращаемое значение в методе. Если вы можете принять код ваучера от вызывающего абонента, то он должен быть проверен на наличие дубликатов и его действительность и т. Д. Все аргументы метода должны быть подтверждены / проверены. Метод построения номера ваучера, вероятно, следует перенести в отдельный служебный метод, и вам следует подумать о добавлении проверки на дубликаты номеров ваучеров после ее создания. Более простой альтернативой будет Guid.New().ToString("N"), обеспечивающий эффективный «случайный» 32-символьный код. Сокращение его до 20 символов ослабит его, но это позволит избежать запутанных букв (0 против O).

Единственное, что ваш сервис должен гарантировать, что все обязательные поля (не допускающие нулевые значения) для этого нового ваучера либо предоставлены в качестве параметров, либо созданы в этом методе.

...