рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░ред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдПрдХ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдЯреАрд╕реАрдкреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдФрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдпрд╣ рд╕рдм рдХреИрд╕реЗ рд╢реБрд░реВ рд╣реБрдЖред
рдпрд╣ рд╕рдм рдПрдХ рдореБрд╢реНрдХрд┐рд▓ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рд╣реБрдЖ рдЬрд╣рд╛рдВ рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдмреАрдЪ рдмрд╛рддрдЪреАрдд рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╣реИред рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдбрдмреНрд▓реНрдпреВрд╕реАрдПрдл рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ, рд▓реЗрдХрд┐рди, рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдХрдорд┐рдпреЛрдВ рдФрд░ рдХреБрдЫ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд┐рдирд╛ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рдбреЗрдЯрд╛ рдЯреНрд░рд╛рдВрд╕рдлрд░ рдЧрддрд┐ рдХреЛ рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╕рд░рд▓ рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдХрд╛рдлреА рдХрд╛рд░реНрдпрд╛рддреНрдордХред
рд╣рдо рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХ рдХрдХреНрд╖рд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рддреЗ рд╣реИрдВред
public interface ICommon { string[] GetAvailableUsers(); void ChangePrivileges(string Login, string password); } public interface IDog { bool TryFindObject(out object obj); int Bark(int nTimes); } public interface ICat { void CutTheText(ref string Text); }
рдпрд╣рд╛рдВ рд╣рдордиреЗ рддреАрди рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд╣реБрдВрдЪ рд╕реНрддрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдЕрдиреБрдорд╛рди рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдо рдореЗрдВ рд╕рднреА рдкреНрд░рдХрд╛рд░ рдХреЗ рджреВрд░рд╕реНрде рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдБ рд╣реЛрдВрдЧреАред рдпрд╣рд╛рдВ рдбреЙрдЧ рдФрд░ рдХреИрдЯ, рдпреЗ рд╣рдорд╛рд░реЗ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░рд┐рдореЛрдЯ рдХреНрд▓рд╛рдЗрдВрдЯ рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗрд╡рд▓ рдЦреБрдж рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реЛрдЧреАред
рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░реЗрдВрдЧреЗред
[Serializable] public class Message { public Message(string Command, object[] Parameters) { this.Command = Command; if (Parameters != null) this.prms = Parameters; } public bool IsSync; public bool IsEmpty = true; public readonly string Command; public object ReturnValue; public object[] prms; public Exception Exception; }
рдЧреНрд░рд╛рд╣рдХ
рдХреНрд▓рд╛рдЗрдВрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рдХрдиреЗрдХреНрд╢рди рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдРрд╕рд╛ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ рдЬреЛ рдкрд░рджреЗ рдХреЗ рдкреАрдЫреЗ рд▓рд╛рдЧреВ рд╣реЛ:
private class Proxy<T> : RealProxy where T : class { UniservClient client; public Proxy(UniservClient client): base(typeof(T)) { this.client = client; } public override IMessage Invoke(IMessage msg) { IMethodCallMessage call = (IMethodCallMessage)msg; object[] parameters = call.Args; int OutArgsCount = call.MethodBase.GetParameters().Where(x => x.IsOut).Count(); Message result = client.Execute(call.MethodName, parameters); parameters = parameters.Select((x, index) => result.prms[index] ?? x).ToArray(); return new ReturnMessage(result.ReturnValue, parameters, OutArgsCount, call.LogicalCallContext, call); } }
рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐рдпреЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЧреБрдг рдмрдирд╛рдПрдБ:
public ICommon Common { get; private set; } public IDog Dog { get; private set; } public ICat Cat { get; private set; }
рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрд░рджреЗ рдХреЗ рдкреАрдЫреЗ рдФрд░ рдЧреБрдг:
CommonProxy = new Proxy<ICommon>(this); DogProxy = new Proxy<IDog>(this); CatProxy = new Proxy<ICat>(this); Common = (ICommon)CommonProxy.GetTransparentProxy(); Dog = (IDog)DogProxy.GetTransparentProxy(); Cat = (ICat)CatProxy.GetTransparentProxy();
рд╕рд░реНрд╡рд░ рдЖрджреЗрд╢ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛:
private void Listener() { while (true) { try { if (ListenerToken.IsCancellationRequested) return; if (!IsConnected) _Connect(); while (true) { if (ListenerToken.IsCancellationRequested) return; Message msg = ReceiveData<Message>(); if (msg.Command == "OnPing") {
рджреВрд░рд╕реНрде рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐рдпрд╛рдБ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ:
private Message Execute(string MethodName, object[] parameters) { lock (syncLock) { _syncResult = new Message(MethodName, parameters); _syncResult.IsSync = true; _OnResponce.Reset(); SendData(_syncResult); _OnResponce.Wait();
рд╕рд╛рдорд╛рдиреНрдп рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдХреНрд▓рд╛рдЗрдВрдЯ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:
рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░реЙрдХреНрд╕реА рд╕рд░реНрд╡рд░ рдкрд░ рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИред рдкреНрд░реЙрдХреНрд╕реА рд╕рд░реНрд╡рд░ рдХреЛ рдЙрд╕рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╡рд┐рдзрд┐ рдХрд╛ рдирд╛рдо рднреЗрдЬрддрд╛ рд╣реИ рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреА рдкреНрд░рддреНрдпрд╛рд╢рд╛ рдореЗрдВ рдзрд╛рд░рд╛ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рддрд╛ рд╣реИред рд╕рд░реНрд╡рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреВрд╕рд░реЗ рдереНрд░реЗрдб рдореЗрдВ рдкрд╛рд░реНрд╕ рд╣реЛрддреА рд╣реИ, рдЬреЛ рдЕрд╡рд░реБрджреНрдз рдереНрд░реЗрдб рдХреЛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рд╕рд░реНрд╡рд░
рдЖрдЗрдП рдЙрди рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдПрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рдмрдирд╛рдПрдБ рдЬреЛ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░реЗрдВрдЧреЗ:
public class Cat_Ring0 : Ring2, ICat { public Cat_Ring0(User u) : base(u) { up.UserType = UserType.Cat; } public void CutTheText(ref string Text) { Text = Text.Remove(Text.Length - 1); } } public class Dog_Ring0 : Dog_Ring1, IDog { public Dog_Ring0(User u) : base(u) { up.UserType = UserType.Dog; } public int Bark(int nTimes) { var ConnectedDogs = ConnectedUsers.ToArray().Where(x => x.UserType == UserType.Dog).Select(x => x.nStream); ConnectedDogs.AsParallel().ForAll(nStream => { SendMessage(nStream, new Message("OnBark", new object[] { nTimes})); }); return ConnectedDogs.Count(); } } public class Dog_Ring1 : Ring2 { public Dog_Ring1(User u): base(u) { up.UserType = UserType.Dog; } public bool TryFindObject(out object obj) { obj = "TheBall"; return true; } } public class Ring2 : Ring, ICommon { public Ring2(User u) : base(u) { } public string[] GetAvailableUsers() { return new string[] { "Dog0", "Dog1", "Tom" }; } public void ChangePrivileges(string Animal, string password) { switch (Animal) { case "Dog0": if (password != "groovy!") throw new Exception(" "); up.ClassInstance = new Dog_Ring0(up); break; case "Dog1": if (password != "_password") throw new Exception(" "); up.ClassInstance = new Dog_Ring1(up); break; case "Tom": if (password != "TheCat") throw new Exception(" "); up.ClassInstance = new Cat_Ring0(up); break; default: throw new Exception(" "); } } } public abstract class Ring { public readonly User up; public Ring(User up) { this.up = up; } }
рдЕрдм рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд "рд░рд┐рдВрдЧ" рдореЗрдВ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рддрд╛рдХрд┐ рд╕рдВрдмрдВрдзрд┐рдд рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХреА рдкрд╣реБрдВрдЪ рд╣реЛред Ring0 рдкрд╣реБрдВрдЪ рдХрд╛ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рд╣реИ; рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рди рдХреЗрд╡рд▓ рдЗрд╕рдореЗрдВ рдореМрдЬреВрдж рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рддрдХ рдкрд╣реБрдБрдЪ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕рднреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рднреА рд╣реИред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд░рд┐рдВрдЧ 2 рдореЗрдВ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рд╕рднреА рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░,
ChangePrivileges () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛, рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдХреЗ рдмрд╛рдж, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реНрддрд░ рдХреА рдкрд╣реБрдВрдЪ рдХреЗ рд╕рд╛рде рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░рдХрд╛рд░ рдХреЗ "рд░рд┐рдВрдЧ" рдореЗрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред
рдореБрдЦреНрдп рд╕рд░реНрд╡рд░ рдСрдкрд░реЗрд╢рди рдирд┐рдореНрди рд╡рд┐рдзрд┐ рдореЗрдВ рдШрдЯрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:
private void ProcessMessage(Message msg, User u) { string MethodName = msg.Command; if (MethodName == "OnPing") return;
ClassInstance рдкреНрд░реЙрдкрд░реНрдЯреА рдореЗрдВ "рд░рд┐рдВрдЧ" рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЙрд╕рдХреЗ рдирд╛рдо рд╕реЗ рдЦреЛрдЬрд╛ рдЬрд╛рдПрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг рд░рди рд▓реЙрдЧ:

рдкрд░рд┐рдгрд╛рдо WCF рдХреЗ рд╕рдорд╛рди рдПрдХ рд╕рд░рд▓ рдФрд░ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рд╣реИред
рд╕реНрд░реЛрдд рдХреЛ
рдпрд╣рд╛рдВ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛
рд╣реИ