Click here to Skip to main content
15,891,799 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I am working on an Accounting software. It is the first big application I am working on. Thus concerned more about its maintenance and future updates and versioning.

I need to make it so flexible such that independent modules can be replaced easily in future with new modules and whole application need not to be installed again.
For e.g.,
There are 5 voucher forms in Transaction Vouchers section. Each voucher has its own characteristics. Now, if in future a customer demands for a more customised voucher among 5 vouchers or all 5 vouchers, then I am looking for a way by which I can only provide him a customised version of the respective form.

Also, there are some controls that would need upgrades such as a DataGridView or a ListView. I am thinking to create a dll and copy paste updated dlls at installed locations in future.

It would be great if you can share your experiences with your views, suggestions or any external links.

What I have tried:

So far, I know about assemblies in .net and .sln (solution) files and how can I create multiple projects in a single .net solution file.

One way, I am thinking is to create individual Dll files for forms and controls with applied Interfaces and Abstraction to encapsulated classes.

Other way is to build individual projects for each of the required modules and upgrade those projects in future.
Posted
Updated 23-May-16 20:25pm
v2
Comments
Sergey Alexandrovich Kryukov 24-May-16 1:58am    
I'm afraid the question is too vague and the problem is too broad to discuss it seriously in a Quick Answer.

A should answer would be: develop very flexible architecture, incremental development methods, use a lot of prototyping, unit testing and other robust development methods. :-)

A detailed answer may make a big book; and during the time needed to write such book, the future development of software development technologies may change the picture too much to bother. :-)

However, I cannot see why do you consider your application as "quite large".

—SA
Member 11040029 24-May-16 3:46am    
yeah absolutely right..this is a broad issue. And yeah its a large software because it is not only about vouchers, it is actually a business analytic and growth prediction application with desktop client-server and cloud based functionalities.
I am starting it from very bottom, thats y I just mentioned about vouchers and quite large terms.

Sergey, It would be cool if you can help me with some links online or any good books in your knowledge.
Sergey Alexandrovich Kryukov 24-May-16 10:06am    
I can only help if you read my answer (see also my recent comments I just added) and ask some questions.
—SA

1 solution

Please see my comment to the question.

Even though I still think my comment is correct, I can help you with just one thing which would not require writing a whole book. I can help you to dismiss your illusion which you seem to have about "DLLs". Even though it would be quite helpful to break the project into smaller projects, you certainly take it too serious.

Here is why: the .NET units of modularity are not "DLLs". They are assemblies, and it makes big difference:
Assemblies in the Common Language Runtime[^],
Understanding and Using Assemblies and Namespaces in .NET[^],
Assembly Class (System.Reflection)[^].

What you call "DLL" is nothing but an executable module of an assembly; usually, there is only one per assembly, but it's possible to few executable files (meaning: PE files) per assembly. "EXE" is the one with the entry point ("Main").

"DLLs" have not special meaning in .NET. There differences between DLL, EXE (and a lot more) are not really fundamental. To tell you just one thing which is not very well-known: a "real" EXE file (meaning, with application manifest and entry point) can also be referenced by another assembly exactly as a DLL. There are even the cases when it makes certain practical sense.

How it translates into development technology? Very simply: the boundaries between assemblies are so subtle that you don't really need to think that the decision of what goes in what assembly should be taken extremely responsively. There is nothing like that. Just the opposite: it's too easy to rethink distribution of code between assemblies as you develop. It won't be the bad practice to prototype some part of code using one single assembly, and later, as this code matures, re-distribute its parts into separate assemblies. Moreover, it may make your development process much smoother, because it can be hard to predict what part of code is going to grow too big. I'm telling you: the ability to postpone decision is a great thing. And the decision about distributing code between assembly is not the most important.

There are much more important architectural issues. You probably have too narrow view on the separation of concerns. Those more important issues include: how workload is distributed between threads and how threads are synchronized (just one principle: best synchronization is no synchronization), how your architecture reflect the dependencies between programming entities, and one "little" problem which is the matter of concerns of nearly all architectural patterns: how UI is isolated from other aspects of your application. In more heavy cases, you may need application domain. And also, applications can be distributed. Anyway, the present paragraph is the only one which can be evolved into a whole book; for the rest of the issues, one answer would be enough.

Just one practical advice: put all projects in one solution, and reference between assemblies between projects, but DLLs. This way, you will avoid a lot of troubles.

There is only one thing which needs to be different when you put things apart in different assemblies: some internal access modifiers need to become public. Simple, isn't it?

The main idea of this answer is: this answer (and not other Quick answer) cannot be used as a comprehensive advice for "programming in the large".

—SA
 
Share this answer
 
v2
Comments
Member 11040029 24-May-16 3:52am    
Thanks sergey! was looking for this fundamental guidance. But, one thing is in my mind, when I was studying on assemblies, it was mentioned that referencing between too many assemblies may create a long startup and execution time for the whole application or at some points. Is it correct? It makes sense to me, since, loading too many assemblies might put overhead on system.
Sergey Alexandrovich Kryukov 24-May-16 10:02am    
I don't think you are right about execution time.
Do you understand that there is JIT? If you time anything, you have to exclude JIT.

By the way, you can precompile (pre-JIT) assemblies before executing them. See NGEN.EXE.
Apparently, it has advantages and disadvantages.
See also http://www.codeproject.com/Articles/31316/Pre-compile-pre-JIT-your-assembly-on-the-fly-or-tr.

I don't know if you have performance problems with your projects. If you do, chances are, you are looking in wrong direction. It's much more likely to be in your own code, code design...

Now, certainly, breaking one assembly into two creates some overhead. Therefore, one single assembly is a bit lighter than two equivalent assemblies. The purpose of breaking into modules can be 1) reuse, 2) development/maintenance. My advice: don't take these issues seriously.

—SA
Member 11040029 24-May-16 5:58am    
Also, Sergey, pls guide me on modularity(hope this is the right term). I mentioned my need to upgrade individual parts without the need for a complete reinstallation of the application. How can I achieve this.
Sergey Alexandrovich Kryukov 24-May-16 10:04am    
There are technical issues and the issues of your application architecture. I think I explained the basics of technical issues (provided you understand what are prerequisites). But it's impossible to cover the art of creation of application architecture in one Quick Answer.
—SA

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900