Meigs2
❔ Secure, Efficient Data Access in Hybrid Desktop/Web App
Hey yall!
I'm currently working on a hybrid web/desktop application. Is there any sort of .net mechanism/design pattern/authorization schema where an action to request data can be "approved" by the application server and allow a client to directly receive something like a result from a database query? Idea being, I'd like to improve query times on desktop clients by skipping the server-side steps of loading the query result into memory and then re-serializing over the network again. Security is a pretty big concern, and given code is running on a computer accessible by staff who could have potential malicious intentions or who leave their pc exposed to external access, having application code or even having direct DB access is a no-go.
Some more details:
The business domain requires a high degree of secure and auditing, so all the business logic and execution will be running through the application server, which will handle authentication, running queries, etc.
Because this system might have relatively high data-throughput (reporting and audit logging is critically important), I'm slightly worried that if the desktop app just queried data entirely through the server, having to serialize and de-serialize data constantly over the local network might introduce significant slowdowns. I know it's premature at this point, but I'd like to have this in the back of my head while designing so I can accommodate when necessary.
My initial thought/solution would be to have those specific queries execute using a sql data reader and "stream" the result of the query to the client, skipping serialization using something like SingnalR or a similar network stream.
If you've ran into a similar situation before, or there exisits a pattern/feature in ASP.NET already for this scenario, please let me know.
Thanks!
2 replies
Composing a validation function using functional concepts
Hey yall, I've been trying to get into using and applying functional concepts in some of my projects and I'm having some conceptual issues with composing monads.
Problem:
I'm creating a structure to represent a "Version" for a project of mine for structured versioning of databases. A Version is comprised of a Major, Minor, and Patch version numbers, represented by integers. All Versions require a Major number, but do not require a Minor or Patch version. If a Patch version is present, a minor version is required.
i.e.
What I need help with
I could write the validation function very easily in regular old C#, however I think this problem can better be solved in a more "functional" manner, but I believe I'm missing a fundamental concept in functional programming.
When implementing
Validate
, I don't quite understand how I can functionally compose a chain of validation results when the rules for the validation logic comprise of smaller functions whos validation inputs and outputs use more specific values than the containing structure.
i.e.
I dont understand how to compose Validate
when the individual rules use int
s. I can call Rule1(version.Major)
, which returns a Validation<int>
, but that means when calling Bind
on the result, the value I get into the next function is an int
, not the original Version
that I need to continue with.
The library I'm using is half home-rolled, using LaYumba.Functional as a base. I'm not looking for an exact solution here, just the right functional concept for "passing down" the original value in a series of Either
-like monads.
Details:
My record is defined as such:
Where Option
is a monad with the usual Bind
, Map
, etc defined.
I have a validation function, and some other validation rules defined as follows:
Where Validation<T>
is a success/fail style Either
monad where Left
is an enumerable of errors, and Right
is the value of the successful validation.
I could make all the "lower" validation rules take in a version and my issues would be solved but... that seems not quite correct, and I feel like there's a functional solution to compose them properly.
I have to somehow lift version
into a monad and do a Match on success or fail? I can lift the version
into an Option
and match on Some/None, but I still have to pass the version
around? I think I'm missing something critical conceptually.
Thanks!7 replies