I am designing an ERP system ... which has the following modules...
I think it's really important to think about what you are actually building. To say you are building a single system which does ERP is meaningless. This is where SOA can really be helpful.
What you are actually building:
- A service (or services) which satisfies Estimation business use cases via the provision of an Estimation business capability
- A service (or services) which satisfies Planning business use cases via the provision of a Planning business capability
- A service (or services) which satisfies XXXX business use cases via the provision of a XXXX business capability
I strongly suggest you start building out these individual services as completely separate systems. Each of these services should have
- Separate codebase
- Separate database (very important!)
- Separate deployment mechanism
The key to getting SOA right is being able to compose your services at the appropriate level. It is usual to create a service or multiple services for each business capability you want to support.
Perhaps you only require one service per business capability you have listed, or perhaps you need more than one service, for example, because the Accounting capability is very large and encompases multiple capabilities.
So, lecture over. In the interest of answering your questions:
Which instancing mode should I choose?
For performance you should use per-call. This is the most efficient for high volumes because each call is dispatched to a new service instance which only exists for the duration of the call operation. If you are expecting all clients to be WCF also, then you should be using netTcpBinding.
Should I expose a minimal set of standard operations or should I expose large number of functions specific to problem sets?
This depends on many things. There are no rules here, but one guideline would be that communcation between services within a given business capability can be done via resources and HTTP based operations (GET, POST, etc). This is because within a business capability, it is reasonable to expect an entity or resource exposed by one service to have meaning to a consuming service.
Communication between services in different business domains, however, should be more like the latter example; explicit, business-level operations which have meaning outside of the business domain.
Ultimately your question is a great one, because you could write book answering it. However, for this website, answers need to be kept short so I will stop going on at you. However I strongly recommend reading up on SOA in general, especially about business capabilities, service autonomy, and about the differences between RPC and resource-based web services.
For WCF specifically (if that is the technology you are using), you could research high performance WCF services