āĻā§āĻ¨ āĻ¸āĻŦ āĻ¤āĻĨā§āĻ¯ āĻŽā§āĻŽāĻ°āĻŋāĻ¤ā§ āĻ¸āĻāĻ°āĻā§āĻˇāĻŖ āĻāĻ°āĻŦā§āĻ¨?
āĻāĻ¯āĻŧā§āĻŦāĻ¸āĻžāĻāĻ āĻŦāĻž āĻŦā§āĻ¯āĻžāĻāĻāĻ¨ā§āĻĄ āĻĄā§āĻāĻž āĻ¸āĻā§āĻāĻ¯āĻŧ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻŦā§āĻļāĻŋāĻ°āĻāĻžāĻ āĻŦā§āĻĻā§āĻ§āĻŋāĻŽāĻžāĻ¨ āĻŽāĻžāĻ¨ā§āĻˇā§āĻ° āĻĒā§āĻ°āĻĨāĻŽ āĻāĻā§āĻāĻž āĻšāĻŦā§ āĻāĻāĻāĻŋ SQL āĻĄāĻžāĻāĻžāĻŦā§āĻ¸ āĻŦā§āĻā§ āĻ¨ā§āĻāĻ¯āĻŧāĻžāĨ¤
āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻāĻāĻ¨āĻ āĻāĻāĻ¨āĻ āĻŽāĻ¨ā§ āĻāĻ¸ā§ āĻ¯ā§ āĻĄā§āĻāĻž āĻŽāĻĄā§āĻ˛ SQL āĻāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻĒāĻ¯ā§āĻā§āĻ¤ āĻ¨āĻ¯āĻŧ: āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻāĻāĻāĻŋ āĻ āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ āĻŦāĻž āĻ¸āĻžāĻŽāĻžāĻāĻŋāĻ āĻā§āĻ°āĻžāĻĢ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ, āĻāĻĒāĻ¨āĻžāĻā§ āĻŦāĻ¸ā§āĻ¤ā§āĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻāĻāĻŋāĻ˛ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻ āĻ āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ āĻāĻ°āĻ¤ā§ āĻšāĻŦā§āĨ¤
āĻ¸āĻŦāĻā§āĻ¯āĻŧā§ āĻāĻžāĻ°āĻžāĻĒ āĻĒāĻ°āĻŋāĻ¸ā§āĻĨāĻŋāĻ¤āĻŋ āĻšāĻ¯āĻŧ āĻ¯āĻāĻ¨ āĻāĻĒāĻ¨āĻŋ āĻāĻāĻāĻŋ āĻĻāĻ˛ā§ āĻāĻžāĻ āĻāĻ°ā§āĻ¨ āĻāĻŦāĻ āĻāĻāĻāĻ¨ āĻ¸āĻšāĻāĻ°ā§āĻŽā§ āĻāĻžāĻ¨ā§āĻ¨ āĻ¨āĻž āĻāĻŋāĻāĻžāĻŦā§ āĻĻā§āĻ°ā§āĻ¤ āĻĒā§āĻ°āĻļā§āĻ¨ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ āĻšāĻ¯āĻŧāĨ¤ āĻāĻĒāĻ¨āĻŋ N+1 āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻ° āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻāĻ°āĻ¤ā§ āĻāĻŦāĻ āĻ āĻ¤āĻŋāĻ°āĻŋāĻā§āĻ¤ āĻ¸ā§āĻā§ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻ¤ā§ āĻāĻ¤ āĻ¸āĻŽāĻ¯āĻŧ āĻŦā§āĻ¯āĻ¯āĻŧ āĻāĻ°ā§āĻā§āĻ¨ āĻ¯āĻžāĻ¤ā§ āĻŽā§āĻ˛ āĻĒā§āĻˇā§āĻ āĻžāĻ¯āĻŧ SELECT āĻāĻāĻāĻŋ āĻ¯ā§āĻā§āĻ¤āĻŋāĻ¸āĻā§āĻāĻ¤ āĻ¸āĻŽāĻ¯āĻŧā§āĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖ āĻšāĻ¯āĻŧ?
āĻāĻ°ā§āĻāĻāĻŋ āĻāĻ¨āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻšāĻ˛ NoSQLāĨ¤ āĻŦā§āĻļ āĻāĻ¯āĻŧā§āĻ āĻŦāĻāĻ° āĻāĻā§ āĻāĻ āĻŦāĻŋāĻˇāĻ¯āĻŧā§āĻ° āĻāĻžāĻ°āĻĒāĻžāĻļā§ āĻ āĻ¨ā§āĻ āĻšāĻžāĻāĻĒ āĻāĻŋāĻ˛ - āĻ¯ā§āĻā§āĻ¨ā§ āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻāĻ¨āĻ āĻāĻĒāĻ˛āĻā§āĻˇā§āĻ¯ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻ¤āĻžāĻ°āĻž MongoDB āĻŽā§āĻ¤āĻžāĻ¯āĻŧā§āĻ¨ āĻāĻ°ā§āĻāĻŋāĻ˛ āĻāĻŦāĻ json āĻ¨āĻĨāĻŋāĻ° āĻāĻāĻžāĻ°ā§ āĻāĻ¤ā§āĻ¤āĻ° āĻĒā§āĻ¯āĻŧā§ āĻā§āĻļāĻŋ āĻāĻŋāĻ˛ (āĻĒā§āĻ°āĻ¸āĻā§āĻāĻā§āĻ°āĻŽā§, āĻ¨āĻĨāĻŋāĻ¤ā§ āĻŦā§āĻ¤ā§āĻ¤āĻžāĻāĻžāĻ° āĻ˛āĻŋāĻā§āĻāĻā§āĻ˛āĻŋāĻ° āĻāĻžāĻ°āĻŖā§ āĻāĻĒāĻ¨āĻžāĻā§ āĻāĻ¤āĻā§āĻ˛āĻŋ āĻā§āĻ°āĻžāĻ āĻĸā§āĻāĻžāĻ¤ā§ āĻšāĻ¯āĻŧā§āĻāĻŋāĻ˛?).
āĻāĻŽāĻŋ āĻ āĻ¨ā§āĻ¯, āĻŦāĻŋāĻāĻ˛ā§āĻĒ āĻĒāĻĻā§āĻ§āĻ¤āĻŋ āĻā§āĻˇā§āĻāĻž āĻāĻ°āĻžāĻ° āĻĒāĻ°āĻžāĻŽāĻ°ā§āĻļ āĻĻāĻŋāĻā§āĻāĻŋ - āĻā§āĻ¨ āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ āĻŽā§āĻŽāĻ°āĻŋāĻ¤ā§ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĄā§āĻāĻž āĻ¸āĻāĻ°āĻā§āĻˇāĻŖ āĻāĻ°āĻžāĻ° āĻā§āĻˇā§āĻāĻž āĻāĻ°āĻŦā§āĻ¨ āĻ¨āĻž, āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧāĻā§āĻ°āĻŽā§ āĻāĻāĻŋāĻā§ āĻ°ā§āĻ¯āĻžāĻ¨ā§āĻĄāĻŽ āĻ¸ā§āĻā§āĻ°ā§āĻā§ (āĻĢāĻžāĻāĻ˛, āĻ°āĻŋāĻŽā§āĻ āĻĄāĻžāĻāĻžāĻŦā§āĻ¸) āĻ¸āĻāĻ°āĻā§āĻˇāĻŖ āĻāĻ°āĻŦā§āĻ¨?
āĻŽā§āĻŽāĻ°āĻŋ āĻ¸āĻ¸ā§āĻ¤āĻž āĻšāĻ¯āĻŧā§ āĻā§āĻā§, āĻāĻŦāĻ āĻŦā§āĻļāĻŋāĻ°āĻāĻžāĻ āĻā§āĻ āĻāĻŦāĻ āĻŽāĻžāĻāĻžāĻ°āĻŋ āĻāĻāĻžāĻ°ā§āĻ° āĻĒā§āĻ°āĻāĻ˛ā§āĻĒāĻā§āĻ˛āĻŋāĻ° āĻāĻ¨ā§āĻ¯ āĻ¯ā§ āĻā§āĻ¨āĻ āĻ¸āĻŽā§āĻāĻžāĻŦā§āĻ¯ āĻĄā§āĻāĻž 1 GB āĻŽā§āĻŽāĻ°āĻŋāĻ¤ā§ āĻĢāĻŋāĻ āĻšāĻŦā§ā§ˇ (āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻāĻŽāĻžāĻ° āĻĒā§āĻ°āĻŋāĻ¯āĻŧ āĻšā§āĻŽ āĻĒā§āĻ°āĻāĻ˛ā§āĻĒ
āĻĒā§āĻļāĻžāĻĻāĻžāĻ°āĻ°āĻž:
- āĻĄā§āĻāĻžāĻ¤ā§ āĻ ā§āĻ¯āĻžāĻā§āĻ¸ā§āĻ¸ āĻ¸āĻšāĻ āĻšāĻ¯āĻŧā§ āĻ¯āĻžāĻ¯āĻŧ - āĻāĻĒāĻ¨āĻžāĻā§ āĻĒā§āĻ°āĻļā§āĻ¨, āĻ āĻ˛āĻ¸ āĻ˛ā§āĻĄāĻŋāĻ, ORM āĻŦā§āĻļāĻŋāĻˇā§āĻā§āĻ¯āĻā§āĻ˛āĻŋ āĻ¨āĻŋāĻ¯āĻŧā§ āĻāĻŋāĻ¨ā§āĻ¤āĻž āĻāĻ°āĻ¤ā§ āĻšāĻŦā§ āĻ¨āĻž, āĻāĻĒāĻ¨āĻŋ āĻ¸āĻžāĻ§āĻžāĻ°āĻŖ C# āĻ āĻŦāĻā§āĻā§āĻā§āĻ° āĻ¸āĻžāĻĨā§ āĻāĻžāĻ āĻāĻ°ā§āĻ¨;
- āĻŦāĻŋāĻāĻŋāĻ¨ā§āĻ¨ āĻĨā§āĻ°ā§āĻĄ āĻĨā§āĻā§ āĻ ā§āĻ¯āĻžāĻā§āĻ¸ā§āĻ¸ āĻ¸āĻŽā§āĻĒāĻ°ā§āĻāĻŋāĻ¤ āĻā§āĻ¨ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ¨ā§āĻ;
- āĻā§āĻŦ āĻĻā§āĻ°ā§āĻ¤ - āĻā§āĻ¨āĻ āĻ¨ā§āĻāĻāĻ¯āĻŧāĻžāĻ°ā§āĻ āĻ āĻ¨ā§āĻ°ā§āĻ§ āĻ¨ā§āĻ, āĻā§āĻ¨āĻ āĻā§āĻ¯āĻŧā§āĻ°āĻŋ āĻāĻžāĻˇāĻžāĻ¯āĻŧ āĻā§āĻĄā§āĻ° āĻ āĻ¨ā§āĻŦāĻžāĻĻ āĻ¨ā§āĻ, āĻ āĻŦāĻā§āĻā§āĻā§āĻ° (āĻĄāĻŋ)āĻā§āĻ°āĻŽāĻŋāĻāĻāĻ°āĻŖā§āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻ¨ā§āĻ;
- āĻ¯ā§āĻā§āĻ¨ āĻāĻāĻžāĻ°ā§ āĻĄā§āĻāĻž āĻ¸āĻāĻ°āĻā§āĻˇāĻŖ āĻāĻ°āĻž āĻā§āĻ°āĻšāĻŖāĻ¯ā§āĻā§āĻ¯ - āĻ¤āĻž āĻĄāĻŋāĻ¸ā§āĻā§āĻ° XML-āĻ āĻšā§āĻ āĻŦāĻž SQL āĻ¸āĻžāĻ°ā§āĻāĻžāĻ°ā§, āĻŦāĻž Azure āĻā§āĻŦāĻŋāĻ˛ āĻ¸ā§āĻā§āĻ°ā§āĻ-āĻāĨ¤
āĻāĻ¨āĻ¸:
- āĻ āĻ¨ā§āĻā§āĻŽāĻŋāĻ āĻ¸ā§āĻā§āĻ˛āĻŋāĻ āĻšāĻžāĻ°āĻŋāĻ¯āĻŧā§ āĻā§āĻā§, āĻāĻŦāĻ āĻĢāĻ˛āĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻļā§āĻ¨ā§āĻ¯ āĻĄāĻžāĻāĻ¨āĻāĻžāĻāĻŽ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨āĻž āĻāĻ°āĻž āĻ¯āĻžāĻŦā§ āĻ¨āĻž;
- āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ āĻā§āĻ°ā§āĻ¯āĻžāĻļ āĻšāĻ˛ā§, āĻāĻĒāĻ¨āĻŋ āĻāĻāĻļāĻŋāĻāĻāĻžāĻŦā§ āĻĄā§āĻāĻž āĻšāĻžāĻ°āĻžāĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨āĨ¤ (āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻāĻŽāĻžāĻĻā§āĻ° āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ āĻāĻāĻ¨āĻ āĻā§āĻ°ā§āĻ¯āĻžāĻļ āĻšāĻ¯āĻŧ āĻ¨āĻž, āĻ¤āĻžāĻ āĻ¨āĻž?)
āĻāĻāĻž āĻāĻŋāĻāĻžāĻŦā§ āĻāĻžāĻ āĻāĻ°ā§?
āĻ ā§āĻ¯āĻžāĻ˛āĻāĻ°āĻŋāĻĻāĻŽ āĻ¨āĻŋāĻŽā§āĻ¨āĻ°ā§āĻĒ:
- āĻļā§āĻ°ā§āĻ¤ā§, āĻĄā§āĻāĻž āĻ¸ā§āĻā§āĻ°ā§āĻā§āĻ° āĻ¸āĻžāĻĨā§ āĻāĻāĻāĻŋ āĻ¸āĻāĻ¯ā§āĻ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ āĻāĻ°āĻž āĻšāĻ¯āĻŧ āĻāĻŦāĻ āĻĄā§āĻāĻž āĻ˛ā§āĻĄ āĻāĻ°āĻž āĻšāĻ¯āĻŧ;
- āĻāĻāĻāĻŋ āĻ āĻŦāĻā§āĻā§āĻ āĻŽāĻĄā§āĻ˛, āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ āĻ¸ā§āĻā§ āĻāĻŦāĻ āĻ°āĻŋāĻ˛ā§āĻļāĻ¨āĻžāĻ˛ āĻāĻ¨āĻĄā§āĻā§āĻ¸ (1:1, 1:āĻ āĻ¨ā§āĻ) āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻž āĻšāĻ¯āĻŧ;
- āĻ āĻŦāĻā§āĻā§āĻ āĻĒā§āĻ°āĻĒāĻžāĻ°ā§āĻāĻŋ (INotifyPropertyChanged) āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻŦāĻ āĻ¸āĻāĻā§āĻ°āĻšā§ āĻāĻĒāĻžāĻĻāĻžāĻ¨ āĻ¯ā§āĻ āĻŦāĻž āĻ āĻĒāĻ¸āĻžāĻ°āĻŖā§āĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻ¸āĻžāĻŦāĻ¸ā§āĻā§āĻ°āĻŋāĻĒāĻļāĻ¨ āĻ¤ā§āĻ°āĻŋ āĻāĻ°āĻž āĻšāĻ¯āĻŧ (INotifyCollectionChanged);
- āĻ¯āĻāĻ¨ āĻ¸āĻžāĻŦāĻ¸ā§āĻā§āĻ°āĻŋāĻĒāĻļāĻ¨āĻāĻŋ āĻā§āĻ°āĻŋāĻāĻžāĻ° āĻāĻ°āĻž āĻšāĻ¯āĻŧ, āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻŋāĻ¤ āĻŦāĻ¸ā§āĻ¤ā§āĻāĻŋ āĻĄā§āĻāĻž āĻ¸ā§āĻā§āĻ°ā§āĻā§ āĻ˛ā§āĻāĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻ¸āĻžāĻ°āĻŋāĻ¤ā§ āĻ¯ā§āĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧ;
- āĻ¸ā§āĻā§āĻ°ā§āĻā§āĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻā§āĻ˛āĻŋ āĻĒāĻ°ā§āĻ¯āĻžāĻ¯āĻŧāĻā§āĻ°āĻŽā§ (āĻāĻāĻāĻŋ āĻāĻžāĻāĻŽāĻžāĻ°ā§) āĻāĻāĻāĻŋ āĻŦā§āĻ¯āĻžāĻāĻā§āĻ°āĻžāĻāĻ¨ā§āĻĄ āĻĨā§āĻ°ā§āĻĄā§ āĻ¸āĻāĻ°āĻā§āĻˇāĻŖ āĻāĻ°āĻž āĻšāĻ¯āĻŧ;
- āĻāĻĒāĻ¨āĻŋ āĻ¯āĻāĻ¨ āĻ ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻā§āĻļāĻ¨ āĻĨā§āĻā§ āĻĒā§āĻ°āĻ¸ā§āĻĨāĻžāĻ¨ āĻāĻ°ā§āĻ¨, āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻā§āĻ˛āĻŋāĻ āĻ¸āĻā§āĻāĻ¯āĻŧāĻ¸ā§āĻĨāĻžāĻ¨ā§ āĻ¸āĻāĻ°āĻā§āĻˇāĻŋāĻ¤ āĻšāĻ¯āĻŧā§ˇ
āĻā§āĻĄ āĻāĻĻāĻžāĻšāĻ°āĻŖ
āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ā§āĻ¯āĻŧ āĻ¨āĻŋāĻ°ā§āĻāĻ°āĻ¤āĻž āĻ¯ā§āĻ āĻāĻ°āĻž āĻšāĻā§āĻā§
// ĐŅĐŊОвĐŊĐ°Ņ йийĐģиОŅĐĩĐēĐ°
Install-Package OutCode.EscapeTeams.ObjectRepository
// ĐĨŅĐ°ĐŊиĐģиŅĐĩ Đ´Đ°ĐŊĐŊŅŅ
, в ĐēĐžŅĐžŅĐžĐŧ ĐąŅĐ´ŅŅ ŅĐžŅ
ŅĐ°ĐŊŅŅŅŅŅ иСĐŧĐĩĐŊĐĩĐŊиŅ
// ĐŅĐŋĐžĐģŅСŅĐšŅĐĩ ŅĐž, ĐēĐžŅĐžŅŅĐŧ ĐąŅĐ´ĐĩŅĐĩ ĐŋĐžĐģŅСОваŅŅŅŅ.
Install-Package OutCode.EscapeTeams.ObjectRepository.File
Install-Package OutCode.EscapeTeams.ObjectRepository.LiteDb
Install-Package OutCode.EscapeTeams.ObjectRepository.AzureTableStorage
// ĐĐŋŅиОĐŊĐ°ĐģŅĐŊĐž - ĐĩŅĐģи ĐŊŅĐļĐŊĐž Ņ
ŅĐ°ĐŊиŅŅ ĐŧОдĐĩĐģŅ Đ´Đ°ĐŊĐŊŅŅ
Đ´ĐģŅ Hangfire
// Install-Package OutCode.EscapeTeams.ObjectRepository.Hangfire
āĻāĻŽāĻ°āĻž āĻĄā§āĻāĻž āĻŽāĻĄā§āĻ˛ āĻŦāĻ°ā§āĻŖāĻ¨āĻž āĻāĻ°āĻŋ āĻ¯āĻž āĻ¸ā§āĻā§āĻ°ā§āĻā§ āĻ¸āĻāĻ°āĻā§āĻˇāĻŖ āĻāĻ°āĻž āĻšāĻŦā§
public class ParentEntity : BaseEntity
{
public ParentEntity(Guid id) => Id = id;
}
public class ChildEntity : BaseEntity
{
public ChildEntity(Guid id) => Id = id;
public Guid ParentId { get; set; }
public string Value { get; set; }
}
āĻ¤āĻžāĻ°āĻĒāĻ° āĻ āĻŦāĻā§āĻā§āĻ āĻŽāĻĄā§āĻ˛:
public class ParentModel : ModelBase
{
public ParentModel(ParentEntity entity)
{
Entity = entity;
}
public ParentModel()
{
Entity = new ParentEntity(Guid.NewGuid());
}
public Guid? NullableId => null;
// ĐŅиĐŧĐĩŅ ŅвŅСи 1:Many
public IEnumerable<ChildModel> Children => Multiple<ChildModel>(x => x.ParentId);
protected override BaseEntity Entity { get; }
}
public class ChildModel : ModelBase
{
private ChildEntity _childEntity;
public ChildModel(ChildEntity entity)
{
_childEntity = entity;
}
public ChildModel()
{
_childEntity = new ChildEntity(Guid.NewGuid());
}
public Guid ParentId
{
get => _childEntity.ParentId;
set => UpdateProperty(() => _childEntity.ParentId, value);
}
public string Value
{
get => _childEntity.Value;
set => UpdateProperty(() => _childEntity.Value, value
}
// ĐĐžŅŅŅĐŋ Ņ ĐŋОиŅĐēĐžĐŧ ĐŋĐž иĐŊĐ´ĐĩĐēŅŅ
public ParentModel Parent => Single<ParentModel>(ParentId);
protected override BaseEntity Entity => _childEntity;
}
āĻāĻŦāĻ āĻ āĻŦāĻļā§āĻˇā§, āĻĄā§āĻāĻž āĻ ā§āĻ¯āĻžāĻā§āĻ¸ā§āĻ¸ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻ¸āĻāĻā§āĻ°āĻšāĻ¸ā§āĻĨāĻ˛ āĻā§āĻ˛āĻžāĻ¸ āĻ¨āĻŋāĻā§āĻ:
public class MyObjectRepository : ObjectRepositoryBase
{
public MyObjectRepository(IStorage storage) : base(storage, NullLogger.Instance)
{
IsReadOnly = true; // ĐĐģŅ ŅĐĩŅŅОв, ĐŋОСвОĐģŅĐĩŅ ĐŊĐĩ ŅĐžŅ
ŅĐ°ĐŊŅŅŅ иСĐŧĐĩĐŊĐĩĐŊиŅ в йаСŅ
AddType((ParentEntity x) => new ParentModel(x));
AddType((ChildEntity x) => new ChildModel(x));
// ĐŅĐģи иŅĐŋĐžĐģŅСŅĐĩŅŅŅ Hangfire и ĐŊĐĩОйŅ
ОдиĐŧĐž Ņ
ŅĐ°ĐŊиŅŅ ĐŧОдĐĩĐģŅ Đ´Đ°ĐŊĐŊŅŅ
Đ´ĐģŅ Hangfire в ObjectRepository
// this.RegisterHangfireScheme();
Initialize();
}
}
āĻāĻāĻāĻŋ ObjectRepository āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§āĻ¨:
var memory = new MemoryStream();
var db = new LiteDatabase(memory);
var dbStorage = new LiteDbStorage(db);
var repository = new MyObjectRepository(dbStorage);
await repository.WaitForInitialize();
āĻ¯āĻĻāĻŋ āĻĒā§āĻ°āĻāĻ˛ā§āĻĒāĻāĻŋ āĻšā§āĻ¯āĻžāĻāĻĢāĻžāĻ¯āĻŧāĻžāĻ° āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻŦā§
public void ConfigureServices(IServiceCollection services, ObjectRepository objectRepository)
{
services.AddHangfire(s => s.UseHangfireStorage(objectRepository));
}
āĻāĻāĻāĻŋ āĻ¨āĻ¤ā§āĻ¨ āĻŦāĻ¸ā§āĻ¤ā§ āĻ¸āĻ¨ā§āĻ¨āĻŋāĻŦā§āĻļ āĻāĻ°āĻž āĻšāĻā§āĻā§:
var newParent = new ParentModel()
repository.Add(newParent);
āĻāĻ āĻāĻ˛ āĻĻāĻŋāĻ¯āĻŧā§, āĻŦāĻ¸ā§āĻ¤ā§ āĻ āĻāĻŋāĻāĻžāĻŦāĻ āĻŽāĻĄā§āĻ˛ āĻĄāĻžāĻāĻžāĻŦā§āĻ¸ā§ āĻ˛ā§āĻāĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻ¸ā§āĻĨāĻžāĻ¨ā§āĻ¯āĻŧ āĻā§āĻ¯āĻžāĻļā§ āĻāĻŦāĻ āĻ¸āĻžāĻ°āĻŋ āĻāĻāĻ¯āĻŧāĻ āĻ¯ā§āĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤ āĻ āĻ¤āĻāĻŦ, āĻāĻ āĻ āĻĒāĻžāĻ°ā§āĻļāĻ¨āĻāĻŋ O(1) āĻ¨ā§āĻ¯āĻŧ, āĻāĻŦāĻ āĻāĻ āĻŦāĻ¸ā§āĻ¤ā§āĻāĻŋ āĻ āĻŦāĻŋāĻ˛āĻŽā§āĻŦā§ āĻāĻžāĻ āĻāĻ°āĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤
āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻ°āĻŋāĻĒā§āĻāĻŋāĻāĻ°āĻŋāĻ¤ā§ āĻāĻ āĻ āĻŦāĻā§āĻā§āĻāĻāĻŋ āĻā§āĻāĻā§ āĻŦā§āĻ° āĻāĻ°āĻ¤ā§ āĻāĻŦāĻ āĻĒā§āĻ°āĻ¤ā§āĻ¯āĻžāĻŦāĻ°ā§āĻ¤āĻŋāĻ¤ āĻŦāĻ¸ā§āĻ¤ā§āĻāĻŋ āĻāĻāĻ āĻāĻĻāĻžāĻšāĻ°āĻŖ āĻ¤āĻž āĻ¯āĻžāĻāĻžāĻ āĻāĻ°āĻ¤ā§:
var parents = repository.Set<ParentModel>();
var myParent = parents.Find(newParent.Id);
Assert.IsTrue(ReferenceEquals(myParent, newParent));
āĻāĻŋ āĻšāĻā§āĻā§? āĻ¸ā§āĻ () āĻĒā§āĻ°āĻ¤ā§āĻ¯āĻžāĻŦāĻ°ā§āĻ¤āĻ¨ āĻā§āĻŦāĻŋāĻ˛ āĻĄāĻŋāĻāĻļāĻ¨āĻžāĻ°āĻŋ, āĻ¯ā§āĻāĻž āĻŦāĻšāĻ¨ āĻāĻ°ā§ āĻ¸āĻŽāĻ¸āĻžāĻŽāĻ¯āĻŧāĻŋāĻ āĻ āĻāĻŋāĻ§āĻžāĻ¨ āĻāĻŦāĻ āĻĒā§āĻ°āĻžāĻĨāĻŽāĻŋāĻ āĻāĻŦāĻ āĻŽāĻžāĻ§ā§āĻ¯āĻŽāĻŋāĻ āĻ¸ā§āĻāĻā§āĻ° āĻ āĻ¤āĻŋāĻ°āĻŋāĻā§āĻ¤ āĻāĻžāĻ°ā§āĻ¯āĻāĻžāĻ°āĻŋāĻ¤āĻž āĻĒā§āĻ°āĻĻāĻžāĻ¨ āĻāĻ°ā§āĨ¤ āĻāĻāĻŋ āĻāĻĒāĻ¨āĻžāĻā§ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻŦāĻ¸ā§āĻ¤ā§āĻ° āĻāĻĒāĻ° āĻ¸āĻŽā§āĻĒā§āĻ°ā§āĻŖāĻ°ā§āĻĒā§ āĻĒā§āĻ¨āĻ°āĻžāĻŦā§āĻ¤ā§āĻ¤āĻŋ āĻ¨āĻž āĻāĻ°ā§ āĻāĻāĻĄāĻŋ (āĻŦāĻž āĻ āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻ°ā§āĻŦāĻŋāĻāĻžāĻ°ā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻāĻžāĻ°ā§ āĻ¸ā§āĻā§) āĻĻā§āĻŦāĻžāĻ°āĻž āĻ āĻ¨ā§āĻ¸āĻ¨ā§āĻ§āĻžāĻ¨ā§āĻ° āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻā§āĻ˛āĻŋāĻā§ āĻ āĻ¨ā§āĻŽāĻ¤āĻŋ āĻĻā§āĻ¯āĻŧāĨ¤
āĻŦāĻ¸ā§āĻ¤ā§ āĻ¯ā§āĻ āĻāĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻ
āĻŦāĻā§āĻā§āĻā§ āĻ°āĻŋāĻĒā§āĻāĻŋāĻāĻ°āĻŋ āĻ¤āĻžāĻĻā§āĻ° āĻŦā§āĻļāĻŋāĻˇā§āĻā§āĻ¯ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ āĻ¸āĻžāĻŦāĻ¸ā§āĻā§āĻ°āĻŋāĻĒāĻļāĻ¨ āĻ¯ā§āĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧ, āĻ¤āĻžāĻ āĻŦā§āĻļāĻŋāĻˇā§āĻā§āĻ¯ā§āĻ° āĻā§āĻ¨ā§ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ā§āĻ° āĻĢāĻ˛ā§ āĻāĻ āĻŦāĻ¸ā§āĻ¤ā§āĻāĻŋ āĻ˛ā§āĻāĻžāĻ° āĻ¸āĻžāĻ°āĻŋāĻ¤ā§ āĻ¯ā§āĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤
āĻŦāĻžāĻāĻ°ā§ āĻĨā§āĻā§ āĻŦā§āĻļāĻŋāĻˇā§āĻā§āĻ¯āĻā§āĻ˛āĻŋ āĻāĻĒāĻĄā§āĻ āĻāĻ°āĻž āĻāĻāĻāĻŋ POCO āĻ
āĻŦāĻā§āĻā§āĻā§āĻ° āĻ¸āĻžāĻĨā§ āĻāĻžāĻ āĻāĻ°āĻžāĻ° āĻŽāĻ¤ā§āĻ āĻĻā§āĻāĻžāĻ¯āĻŧ:
myParent.Children.First().Property = "Updated value";
āĻāĻĒāĻ¨āĻŋ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻāĻŋāĻ¤ āĻāĻĒāĻžāĻ¯āĻŧā§ āĻāĻāĻāĻŋ āĻŦāĻ¸ā§āĻ¤ā§ āĻŽā§āĻā§ āĻĢā§āĻ˛āĻ¤ā§ āĻĒāĻžāĻ°ā§āĻ¨:
repository.Remove(myParent);
repository.RemoveRange(otherParents);
repository.Remove<ParentModel>(x => !x.Children.Any());
āĻāĻāĻŋ āĻŽā§āĻā§ āĻĢā§āĻ˛āĻžāĻ° āĻ¸āĻžāĻ°āĻŋāĻ¤ā§ āĻŦāĻ¸ā§āĻ¤ā§āĻāĻŋāĻā§ āĻ¯ā§āĻ āĻāĻ°ā§āĨ¤
āĻāĻŋāĻāĻžāĻŦā§ āĻ¸āĻā§āĻāĻ¯āĻŧ āĻāĻžāĻ āĻāĻ°ā§?
āĻ āĻŦāĻā§āĻā§āĻā§ āĻ°āĻŋāĻĒā§āĻāĻŋāĻāĻ°āĻŋ āĻ¯āĻāĻ¨ āĻ¨āĻŋāĻ°ā§āĻā§āĻˇāĻŖ āĻāĻ°āĻž āĻŦāĻ¸ā§āĻ¤ā§ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻšāĻ¯āĻŧ (āĻšāĻ¯āĻŧ āĻ¯ā§āĻ āĻāĻ°āĻž āĻŦāĻž āĻŽā§āĻā§ āĻĢā§āĻ˛āĻž, āĻŦāĻž āĻŦā§āĻļāĻŋāĻˇā§āĻā§āĻ¯ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨), āĻāĻāĻāĻŋ āĻāĻāĻ¨āĻž āĻāĻ¤ā§āĻĨāĻžāĻĒāĻ¨ āĻāĻ°ā§ āĻŽāĻĄā§āĻ˛ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻŋāĻ¤āĻ¸āĻĻāĻ¸ā§āĻ¯āĻ¤āĻž āĻ¨āĻŋāĻ¯āĻŧā§āĻā§ āĻ¸ā§āĻā§āĻ°ā§āĻ. āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ¸ā§āĻā§āĻ°ā§āĻ āĻ¯āĻāĻ¨ āĻāĻāĻāĻŋ āĻāĻāĻ¨āĻž āĻāĻā§ āĻŽāĻĄā§āĻ˛ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻŋāĻ¤ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻā§āĻ˛āĻŋāĻā§ 3āĻāĻŋ āĻ¸āĻžāĻ°āĻŋāĻ¤ā§ āĻ°āĻžāĻāĻž āĻšāĻ¯āĻŧ - āĻ¯ā§āĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻāĻĒāĻĄā§āĻ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻŦāĻ āĻŽā§āĻā§ āĻĢā§āĻ˛āĻžāĻ° āĻāĻ¨ā§āĻ¯āĨ¤
āĻāĻāĻžāĻĄāĻŧāĻžāĻ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻ¨ āĻ¸ā§āĻā§āĻ°ā§āĻ āĻāĻ°āĻŽā§āĻ āĻāĻ°āĻžāĻ° āĻĒāĻ°ā§, āĻ¤āĻžāĻ°āĻž āĻāĻāĻāĻŋ āĻāĻžāĻāĻŽāĻžāĻ° āĻ¤ā§āĻ°āĻŋ āĻāĻ°ā§ āĻ¯āĻžāĻ° āĻĢāĻ˛ā§ āĻĒā§āĻ°āĻ¤āĻŋ 5 āĻ¸ā§āĻā§āĻ¨ā§āĻĄā§ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻā§āĻ˛āĻŋ āĻ¸āĻāĻ°āĻā§āĻˇāĻŖ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤
āĻāĻĒāĻ°āĻ¨ā§āĻ¤ā§, āĻāĻāĻāĻŋ āĻ¸āĻāĻ°āĻā§āĻˇāĻŖ āĻāĻ˛ āĻā§āĻ° āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻāĻāĻāĻŋ API āĻāĻā§: ObjectRepository.Save().
āĻĒā§āĻ°āĻ¤āĻŋāĻāĻŋ āĻ¸āĻāĻ°āĻā§āĻˇāĻŖā§āĻ° āĻāĻā§, āĻ āĻ°ā§āĻĨāĻšā§āĻ¨ āĻā§āĻ°āĻŋāĻ¯āĻŧāĻžāĻāĻ˛āĻžāĻĒāĻā§āĻ˛āĻŋ āĻĒā§āĻ°āĻĨāĻŽā§ āĻ¸āĻžāĻ°āĻŋ āĻĨā§āĻā§ āĻ¸āĻ°āĻžāĻ¨ā§ āĻšāĻ¯āĻŧ (āĻāĻĻāĻžāĻšāĻ°āĻŖāĻ¸ā§āĻŦāĻ°ā§āĻĒ, āĻ¸āĻĻā§āĻļ āĻāĻā§āĻ¨ā§āĻ - āĻ¯āĻāĻ¨ āĻāĻāĻāĻŋ āĻŦāĻ¸ā§āĻ¤ā§ āĻĻā§āĻŦāĻžāĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻ°āĻž āĻšāĻ¯āĻŧ āĻŦāĻž āĻĻā§āĻ°ā§āĻ¤ āĻŦāĻ¸ā§āĻ¤ā§ āĻ¯ā§āĻā§āĻ¤/āĻŽā§āĻā§ āĻĢā§āĻ˛āĻž āĻšāĻ¯āĻŧ), āĻāĻŦāĻ āĻļā§āĻ§ā§āĻŽāĻžāĻ¤ā§āĻ° āĻ¤āĻāĻ¨āĻ āĻ¸ā§āĻ āĻāĻ°āĻž āĻšāĻ¯āĻŧāĨ¤
āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻā§āĻˇā§āĻ¤ā§āĻ°ā§, āĻ¸āĻŽāĻā§āĻ° āĻŦāĻ°ā§āĻ¤āĻŽāĻžāĻ¨ āĻ āĻŦāĻā§āĻā§āĻ āĻ¸āĻāĻ°āĻā§āĻˇāĻŋāĻ¤ āĻšāĻ¯āĻŧ, āĻ¤āĻžāĻ āĻāĻāĻž āĻ¸āĻŽā§āĻāĻŦ āĻ¯ā§ āĻŦāĻ¸ā§āĻ¤ā§āĻā§āĻ˛āĻŋāĻā§ āĻ¸āĻžāĻ°āĻŋāĻ¤ā§ āĻ¯ā§āĻā§āĻ¤ āĻāĻ°āĻžāĻ° āĻ¸āĻŽāĻ¯āĻŧ āĻĨā§āĻā§ āĻ āĻŦāĻā§āĻā§āĻā§āĻ° āĻ¨āĻ¤ā§āĻ¨ āĻ¸āĻāĻ¸ā§āĻāĻ°āĻŖāĻā§āĻ˛āĻŋ āĻ¸āĻš, āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§ āĻ¤āĻžāĻ° āĻĨā§āĻā§ āĻāĻŋāĻ¨ā§āĻ¨ āĻā§āĻ°āĻŽā§ āĻ¸āĻāĻ°āĻā§āĻˇāĻŖ āĻāĻ°āĻž āĻšāĻ¯āĻŧā§āĻā§āĨ¤
āĻāĻŋ āĻāĻŋ āĻāĻā§?
- āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻ˛āĻžāĻāĻŦā§āĻ°ā§āĻ°āĻŋ .NET āĻ¸ā§āĻā§āĻ¯āĻžāĻ¨ā§āĻĄāĻžāĻ°ā§āĻĄ 2.0 āĻāĻ° āĻāĻĒāĻ° āĻāĻŋāĻ¤ā§āĻ¤āĻŋ āĻāĻ°ā§āĨ¤ āĻ¯ā§āĻā§āĻ¨ā§ āĻāĻ§ā§āĻ¨āĻŋāĻ .NET āĻĒā§āĻ°āĻāĻ˛ā§āĻĒā§ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻ¯ā§āĻ¤ā§ āĻĒāĻžāĻ°ā§āĨ¤
- API āĻĨā§āĻ°ā§āĻĄ āĻ¨āĻŋāĻ°āĻžāĻĒāĻĻāĨ¤ āĻ
āĻā§āĻ¯āĻ¨ā§āĻ¤āĻ°ā§āĻŖ āĻ¸āĻāĻā§āĻ°āĻš āĻāĻĒāĻ° āĻāĻŋāĻ¤ā§āĻ¤āĻŋ āĻāĻ°ā§ āĻŦāĻžāĻ¸ā§āĻ¤āĻŦāĻžāĻ¯āĻŧāĻŋāĻ¤ āĻšāĻ¯āĻŧ āĻ¸āĻŽāĻ¸āĻžāĻŽāĻ¯āĻŧāĻŋāĻ āĻ
āĻāĻŋāĻ§āĻžāĻ¨, āĻāĻā§āĻ¨ā§āĻ āĻšā§āĻ¯āĻžāĻ¨ā§āĻĄāĻ˛āĻžāĻ°āĻĻā§āĻ° āĻšāĻ¯āĻŧ āĻ¤āĻžāĻ˛āĻž āĻāĻā§ āĻŦāĻž āĻ¤āĻžāĻĻā§āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻ¨ā§āĻāĨ¤
āĻŽāĻ¨ā§ āĻ°āĻžāĻāĻžāĻ° āĻŽāĻ¤ āĻāĻāĻŽāĻžāĻ¤ā§āĻ° āĻāĻŋāĻ¨āĻŋāĻ¸ āĻāĻ˛ āĻāĻ°āĻž ObjectRepository.Save(); - āĻ¨āĻŋāĻ°ā§āĻŦāĻŋāĻāĻžāĻ°ā§ āĻ¸ā§āĻā§ (āĻ¸ā§āĻŦāĻ¤āĻ¨ā§āĻ¤ā§āĻ°āĻ¤āĻž āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨):
repository.Set<ChildModel>().AddIndex(x => x.Value);
repository.Set<ChildModel>().Find(x => x.Value, "myValue");
āĻā§ āĻāĻāĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°ā§?
āĻŦā§āĻ¯āĻā§āĻ¤āĻŋāĻāĻ¤āĻāĻžāĻŦā§, āĻāĻŽāĻŋ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻļāĻā§āĻ° āĻĒā§āĻ°āĻāĻ˛ā§āĻĒāĻā§āĻ˛āĻŋāĻ¤ā§ āĻāĻ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻāĻ°āĻž āĻļā§āĻ°ā§ āĻāĻ°ā§āĻāĻŋ āĻāĻžāĻ°āĻŖ āĻāĻāĻŋ āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻāĻ¨āĻ āĻāĻŦāĻ āĻĄā§āĻāĻž āĻ ā§āĻ¯āĻžāĻā§āĻ¸ā§āĻ¸ āĻ˛ā§āĻ¯āĻŧāĻžāĻ° āĻ˛ā§āĻāĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻŦāĻž āĻāĻžāĻ°ā§ āĻ āĻŦāĻāĻžāĻ āĻžāĻŽā§ āĻ¸ā§āĻĨāĻžāĻĒāĻ¨ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻŦāĻĄāĻŧ āĻāĻ°āĻā§āĻ° āĻĒā§āĻ°āĻ¯āĻŧā§āĻāĻ¨ āĻšāĻ¯āĻŧ āĻ¨āĻžāĨ¤ āĻŦā§āĻ¯āĻā§āĻ¤āĻŋāĻāĻ¤āĻāĻžāĻŦā§, litedb āĻŦāĻž āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻ˛ā§ āĻĄā§āĻāĻž āĻ¸āĻāĻ°āĻā§āĻˇāĻŖ āĻāĻ°āĻž āĻ¸āĻžāĻ§āĻžāĻ°āĻŖāĻ¤ āĻāĻŽāĻžāĻ° āĻāĻ¨ā§āĻ¯ āĻ¯āĻĨā§āĻˇā§āĻāĨ¤
āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻ āĻ¤ā§āĻ¤ā§, āĻ¯āĻāĻ¨ āĻāĻāĻ¨ āĻŦāĻŋāĻ˛ā§āĻĒā§āĻ¤ āĻ¸ā§āĻāĻžāĻ°ā§āĻāĻāĻĒ EscapeTeams (āĻāĻŽāĻŋ āĻāĻžāĻŦāĻ˛āĻžāĻŽ āĻāĻāĻž āĻāĻāĻžāĻ¨ā§, āĻāĻžāĻāĻž - āĻāĻŋāĻ¨ā§āĻ¤ā§ āĻ¨āĻž, āĻāĻŦāĻžāĻ° āĻ āĻāĻŋāĻā§āĻāĻ¤āĻž) - Azure āĻā§āĻŦāĻŋāĻ˛ āĻ¸ā§āĻā§āĻ°ā§āĻā§ āĻĄā§āĻāĻž āĻ¸āĻā§āĻāĻ¯āĻŧ āĻāĻ°āĻ¤ā§ āĻŦā§āĻ¯āĻŦāĻšā§āĻ¤ āĻšāĻ¯āĻŧāĨ¤
āĻāĻŦāĻŋāĻˇā§āĻ¯āĻ¤ā§āĻ° āĻāĻ¨ā§āĻ¯ āĻĒāĻ°āĻŋāĻāĻ˛ā§āĻĒāĻ¨āĻž
āĻāĻŽāĻŋ āĻāĻ āĻĒāĻĻā§āĻ§āĻ¤āĻŋāĻ° āĻĒā§āĻ°āĻ§āĻžāĻ¨ āĻ āĻ¸ā§āĻŦāĻŋāĻ§āĻžāĻā§āĻ˛āĻŋāĻ° āĻāĻāĻāĻŋ āĻ āĻŋāĻ āĻāĻ°āĻ¤ā§ āĻāĻžāĻ - āĻ āĻ¨ā§āĻā§āĻŽāĻŋāĻ āĻ¸ā§āĻā§āĻ˛āĻŋāĻāĨ¤ āĻāĻāĻŋ āĻāĻ°āĻžāĻ° āĻāĻ¨ā§āĻ¯, āĻāĻĒāĻ¨āĻžāĻā§ āĻšāĻ¯āĻŧ āĻŦāĻŋāĻ¤āĻ°āĻŖ āĻāĻ°āĻž āĻ˛ā§āĻ¨āĻĻā§āĻ¨ (sic!), āĻ āĻĨāĻŦāĻž āĻāĻāĻāĻŋ āĻĻā§āĻĸāĻŧ-āĻāĻā§āĻāĻžāĻā§āĻ¤ āĻ¸āĻŋāĻĻā§āĻ§āĻžāĻ¨ā§āĻ¤ āĻ¨āĻŋāĻ¤ā§ āĻšāĻŦā§ āĻ¯ā§ āĻŦāĻŋāĻāĻŋāĻ¨ā§āĻ¨ āĻĻā§āĻˇā§āĻāĻžāĻ¨ā§āĻ¤ āĻĨā§āĻā§ āĻāĻāĻ āĻĄā§āĻāĻž āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻ°āĻž āĻāĻāĻŋāĻ¤ āĻ¨āĻ¯āĻŧ, āĻ āĻĨāĻŦāĻž "āĻļā§āĻˇ āĻā§ āĻ¸āĻ āĻŋāĻ" āĻ¨ā§āĻ¤āĻŋ āĻ āĻ¨ā§āĻ¸āĻžāĻ°ā§ āĻ¤āĻžāĻĻā§āĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨ āĻāĻ°āĻ¤ā§ āĻĻāĻŋāĻ¨āĨ¤
āĻĒā§āĻ°āĻ¯ā§āĻā§āĻ¤āĻŋāĻāĻ¤ āĻĻā§āĻˇā§āĻāĻŋāĻā§āĻŖ āĻĨā§āĻā§, āĻāĻŽāĻŋ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻāĻŋāĻ¤ āĻ¸ā§āĻāĻŋāĻŽāĻāĻŋ āĻ¯āĻ¤āĻāĻž āĻ¸āĻŽā§āĻāĻŦ āĻĻā§āĻāĻ¤ā§ āĻĒāĻžāĻā§āĻāĻŋ:
- āĻ āĻŦāĻā§āĻā§āĻ āĻŽāĻĄā§āĻ˛ā§āĻ° āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤ā§ āĻāĻā§āĻ¨ā§āĻāĻ˛āĻ āĻāĻŦāĻ āĻ¸ā§āĻ¨ā§āĻ¯āĻžāĻĒāĻļāĻ āĻ¸āĻāĻ°āĻā§āĻˇāĻŖ āĻāĻ°ā§āĻ¨
- āĻ āĻ¨ā§āĻ¯āĻžāĻ¨ā§āĻ¯ āĻĻā§āĻˇā§āĻāĻžāĻ¨ā§āĻ¤ āĻā§āĻāĻā§āĻ¨ (āĻ¸ā§āĻāĻŋāĻāĻ¸ā§ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĻā§āĻˇā§āĻāĻžāĻ¨ā§āĻ¤ā§āĻ° āĻļā§āĻˇ āĻĒāĻ¯āĻŧā§āĻ¨ā§āĻ āĻ¯ā§āĻ āĻāĻ°ā§āĻ¨? udp āĻāĻŦāĻŋāĻˇā§āĻāĻžāĻ°? āĻŽāĻžāĻ¸ā§āĻāĻžāĻ°/āĻĻāĻžāĻ¸?)
- RAFT āĻāĻ° āĻŽāĻ¤ā§ āĻ¯ā§āĻā§āĻ¨ āĻāĻ¨āĻ¸ā§āĻ¨āĻ¸āĻžāĻ¸ āĻ ā§āĻ¯āĻžāĻ˛āĻāĻ°āĻŋāĻĻāĻŽā§āĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§ EventLog āĻāĻĻāĻžāĻšāĻ°āĻŖāĻā§āĻ˛āĻŋāĻ° āĻŽāĻ§ā§āĻ¯ā§ āĻĒā§āĻ°āĻ¤āĻŋāĻ˛āĻŋāĻĒāĻŋ āĻāĻ°ā§āĻ¨ā§ˇ
āĻāĻ°āĻ āĻāĻāĻāĻŋ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻž āĻ°āĻ¯āĻŧā§āĻā§ āĻ¯āĻž āĻāĻŽāĻžāĻā§ āĻāĻĻā§āĻŦāĻŋāĻā§āĻ¨ āĻāĻ°ā§ - āĻā§āĻ¯āĻžāĻ¸āĻā§āĻĄ āĻŽā§āĻā§ āĻĢā§āĻ˛āĻž, āĻŦāĻž āĻ āĻ¨ā§āĻ¯ āĻ āĻŦāĻā§āĻā§āĻ āĻĨā§āĻā§ āĻ˛āĻŋāĻā§āĻ āĻ°āĻ¯āĻŧā§āĻā§ āĻāĻŽāĻ¨ āĻŦāĻ¸ā§āĻ¤ā§āĻ° āĻŽā§āĻā§ āĻĢā§āĻ˛āĻžāĻ° āĻā§āĻˇā§āĻ¤ā§āĻ°ā§ āĻ¸āĻ¨āĻžāĻā§āĻ¤āĻāĻ°āĻŖāĨ¤
āĻāĻ¤ā§āĻ¸ āĻā§āĻĄ
āĻāĻĒāĻ¨āĻŋ āĻ¯āĻĻāĻŋ āĻāĻāĻžāĻ¨ā§ āĻ¸āĻŽāĻ¸ā§āĻ¤ āĻĒāĻĨ āĻĒāĻĄāĻŧā§ āĻĨāĻžāĻā§āĻ¨, āĻ¤āĻŦā§ āĻ¯āĻž āĻŦāĻžāĻāĻŋ āĻĨāĻžāĻā§ āĻ¤āĻž āĻšāĻ˛ āĻā§āĻĄāĻāĻŋ āĻĒāĻĄāĻŧāĻ¤ā§; āĻāĻāĻŋ āĻāĻŋāĻāĻšāĻžāĻŦā§ āĻĒāĻžāĻāĻ¯āĻŧāĻž āĻ¯āĻžāĻŦā§:
āĻāĻ¤ā§āĻ¸: www.habr.com