I'm 1/2 way through refactoring an Asp.Net MVC site to use the new beta and noticed my solution compiling without any issues, but Asp.Net compilation errors appearing on run.
Visual Studio wasn't compiling the content of the asp.net pages. Instead they were compiled on demand. Nothing wrong there... Unless you do a big refactoring and need to find errors on those pages all up-front.
That's where the aspnet_compiler command line tool can come in and help. Basically it pre-compiles all pages in an asp.net application. I think the main reason is for performance reasons on a live environment, but it's fabulous for doing refactorings.
aspnet_compiler -p. -v /
executed from the root folder of your website will detect all errors in the markup.
Enjoy!
Wednesday, December 17, 2008
Saturday, October 25, 2008
New things to learn... everywhere!
If you don't like learning new things then I really wouldn't recommend working at Readify! If you do, then it will really invigorate you.
Since starting here is a quick selection of some of what I've done
In the next month I'll be presenting the .Net 3.5 course, running a 2 day WCF workshop, and getting my hands dirty with some Silverlight. And if all goes to plan I'll be going on a SCRUM Master course.
SCRUM / agile methodologies have interested me since back in 2004 when my friend in the UK hired me to work on a SCRUM project at a big Investment Bank. The concepts really made sense to me in a ,"yeah - I knew something wasn't right on a lot of projects I worked on, but couldn't place why", way.
Going forward with Readify I'm hoping to be doing more of the same around training, building, but also moving towards introducing agile approaches to customers that want to adopt them.
Oh, and just because I mention the work SCRUM a lot, don't think I'm going to get into rugby.
Since starting here is a quick selection of some of what I've done
- Shadowed a TFS MVP on engagements soaking up as much TFS goodness as possible
- Installated TFS and showed customers how to use it
- Presented modules on a .Net 3.5 course that was run by Paul Stovell
- Architecture reviews / re-design
- Ran a 2 day workshop on Sql Server Reporting Services
- Presented a session at one of our free community events on WCF
- Produced a WPF Proof of Concept for a customer
In the next month I'll be presenting the .Net 3.5 course, running a 2 day WCF workshop, and getting my hands dirty with some Silverlight. And if all goes to plan I'll be going on a SCRUM Master course.
SCRUM / agile methodologies have interested me since back in 2004 when my friend in the UK hired me to work on a SCRUM project at a big Investment Bank. The concepts really made sense to me in a ,"yeah - I knew something wasn't right on a lot of projects I worked on, but couldn't place why", way.
Going forward with Readify I'm hoping to be doing more of the same around training, building, but also moving towards introducing agile approaches to customers that want to adopt them.
Oh, and just because I mention the work SCRUM a lot, don't think I'm going to get into rugby.
Friday, October 03, 2008
Prism
I spent 1 1/2 years working on a large CAB application for a local Bank and was left with a bitter taste by CAB...
Primarily because it was such a confusing framework to use. Developers found it really difficult to grasp WorkItems and we overused loosely coupled events almost using them to control our process flow.
ObjectBuilder... Say no more.
The guidance / reference implementations were, hmm, not great. They rendered their own views un-testable by having links to concrete classes which would instantiate views, generally breaking the whole idea of a testable design.
So it's been with a little bit of fear that I downloaded the Prism guidance to have a look at what the WPF Composite Guidance is like.
First impressions have been really pleasant. Yes I have seen ObjectBuilder2 (sounds like some dodgy horror movie title), but thankfully have been pretty shielded from it.
WorkItems are gone - this is awesome. They were really unpleasant to explain to people.
DI has taken over bigstyle. Register everything with the Container, and things get resolved automatically. I was a little bit worried that I'd be swimming through Xml soup but smartly the IoC configuration is done in code at a module level.
Things generally seem neater and cleaner. I got my 1st Application up and running in 30 minutes or so, compared to a few hours with CAB.
So generally I'm pretty pleased. Add to that there is a Silverlight version. Cool! I'm sure I'll become a regular contributor to the Prism forums!
Primarily because it was such a confusing framework to use. Developers found it really difficult to grasp WorkItems and we overused loosely coupled events almost using them to control our process flow.
ObjectBuilder... Say no more.
The guidance / reference implementations were, hmm, not great. They rendered their own views un-testable by having links to concrete classes which would instantiate views, generally breaking the whole idea of a testable design.
So it's been with a little bit of fear that I downloaded the Prism guidance to have a look at what the WPF Composite Guidance is like.
First impressions have been really pleasant. Yes I have seen ObjectBuilder2 (sounds like some dodgy horror movie title), but thankfully have been pretty shielded from it.
WorkItems are gone - this is awesome. They were really unpleasant to explain to people.
DI has taken over bigstyle. Register everything with the Container, and things get resolved automatically. I was a little bit worried that I'd be swimming through Xml soup but smartly the IoC configuration is done in code at a module level.
Things generally seem neater and cleaner. I got my 1st Application up and running in 30 minutes or so, compared to a few hours with CAB.
So generally I'm pretty pleased. Add to that there is a Silverlight version. Cool! I'm sure I'll become a regular contributor to the Prism forums!
Messing around with Conchango's SCRUM template for TFS
I've spent a bit of time recently using TFS and trying to get my head around its templates.
Out of the box you get one for MSF for Agile, and one for a heavier, CMMI process. Over the last couple of days though I've installed the Conchango SCRUM template and have been playing with it.
So-far I'm pretty impressed. Especially with the online guidance. I think the videos of Ken Schwaber talking through the various phases of SCRUM are excellent.
I worked with Version-One and Perforce in London a few years ago with great success so am looking forward to playing more with TFS / SCRUM.
Out of the box you get one for MSF for Agile, and one for a heavier, CMMI process. Over the last couple of days though I've installed the Conchango SCRUM template and have been playing with it.
So-far I'm pretty impressed. Especially with the online guidance. I think the videos of Ken Schwaber talking through the various phases of SCRUM are excellent.
I worked with Version-One and Perforce in London a few years ago with great success so am looking forward to playing more with TFS / SCRUM.
Sunday, September 21, 2008
Installing TFS 2008 SP1
I had the fun of doing a TFS installation on a customer site this week using TFS 2008 SP1 and Sql 2008.
What fun! We ended up backing out the SQL 2008 installation, creating a new differencing disk from the Windows Server 2008 baseline we had, and putting SQL 2005 SP2 on instead. I'm not sure exactly what went wrong but the TFS Service just could not connect to the Tfs Warehouse database.
Even with the SQL2K5 installation we had problems connecting through to the Reports from Team Explorer. What could save someone some time is this... Be sure to upgrade not only TFS to SP1 on the Team Explorer machine, but also VS2008. We only did VS2008 and obviously Team Explorer had changed as-well.
What fun! We ended up backing out the SQL 2008 installation, creating a new differencing disk from the Windows Server 2008 baseline we had, and putting SQL 2005 SP2 on instead. I'm not sure exactly what went wrong but the TFS Service just could not connect to the Tfs Warehouse database.
Even with the SQL2K5 installation we had problems connecting through to the Reports from Team Explorer. What could save someone some time is this... Be sure to upgrade not only TFS to SP1 on the Team Explorer machine, but also VS2008. We only did VS2008 and obviously Team Explorer had changed as-well.
Friday, August 15, 2008
RDN last night
Thanks to everyone that came to the RDN last night, and to Chris for doing the "In-Depth" session.
I defintely picked some good information up around Windows Workflow, and hopefully some of you got something out of my WCF Primer presentation. That was my 2nd presentation (I did one for the local .Net user group last year on the Composite Application Block).
I was pretty nervous before, and for the 1st 5 minutes or so, but once I settled into it I managed to put my nerves to the side and present! It's challenging presenting to so many people when everyone is at a different level.
One great thing from doing the presentation is that you learn things about the technologies that you might not have known about before. For example I understand the internals of WCF - its extensibility and messaging layer - much more than a week ago, and a lot of the terms I'd read about - behaviours for example - are a lot clearer in my mind!
As for the experience, it's a buzz and I'd recommend it to anyone. I think it's awesome for building up confidence. I'm hoping to improve my skills as-well as time goes by and will use last night as a personal bench-mark.
An interesting thing after last nights was looking through the feedback forms. I really appreciate the ones with the comments, and the lower scores as those are ones which are really useful for getting better. Not that I don't like the high scores - they are great too!!!
So more coming soon hopefully. Watch this space!
I defintely picked some good information up around Windows Workflow, and hopefully some of you got something out of my WCF Primer presentation. That was my 2nd presentation (I did one for the local .Net user group last year on the Composite Application Block).
I was pretty nervous before, and for the 1st 5 minutes or so, but once I settled into it I managed to put my nerves to the side and present! It's challenging presenting to so many people when everyone is at a different level.
One great thing from doing the presentation is that you learn things about the technologies that you might not have known about before. For example I understand the internals of WCF - its extensibility and messaging layer - much more than a week ago, and a lot of the terms I'd read about - behaviours for example - are a lot clearer in my mind!
As for the experience, it's a buzz and I'd recommend it to anyone. I think it's awesome for building up confidence. I'm hoping to improve my skills as-well as time goes by and will use last night as a personal bench-mark.
An interesting thing after last nights was looking through the feedback forms. I really appreciate the ones with the comments, and the lower scores as those are ones which are really useful for getting better. Not that I don't like the high scores - they are great too!!!
So more coming soon hopefully. Watch this space!
New job, new times, new challenges...
It's been a while since I last wrote so here's an update of what I've been upto.
I left the Bank I was working at. The politics were getting me down and it was wayyyy to stressful. I learnt tons of good stuff whilst there - .Net 3.0, WCF, WPF, CAB to name a few, and made some good friends as-well.
I had a holiday to Vietnam and Cambodia which was awesome. Plenty of pictures at www.flickr.com/photos/graemefoster.
And finally I started working for Readify, an MS Consultancy. For those in the UK who haven't heard of Readify they are a very well respected MS consultancy firm in Australia with a whole bunch of MVP's working for them.
The job is going to be really challenging and exciting. I'll be consulting on architectures, running training sessions, giving presentations to the local community, fixing bugs for customers, you name it I'll be doing it!!!
And along the way I hope to be writing more blog posts about, ummm, stuff!!!
I left the Bank I was working at. The politics were getting me down and it was wayyyy to stressful. I learnt tons of good stuff whilst there - .Net 3.0, WCF, WPF, CAB to name a few, and made some good friends as-well.
I had a holiday to Vietnam and Cambodia which was awesome. Plenty of pictures at www.flickr.com/photos/graemefoster.
And finally I started working for Readify, an MS Consultancy. For those in the UK who haven't heard of Readify they are a very well respected MS consultancy firm in Australia with a whole bunch of MVP's working for them.
The job is going to be really challenging and exciting. I'll be consulting on architectures, running training sessions, giving presentations to the local community, fixing bugs for customers, you name it I'll be doing it!!!
And along the way I hope to be writing more blog posts about, ummm, stuff!!!
Thursday, May 01, 2008
Excited by technology again!
I'm a bit late jumping on this one but today I took delivery of my Squeezebox.
And I love it!

You can tell these guys have learned a thing or two from Apple on design.
The box screams apple,
The setup experience was flawless. It just worked!
Where are you?
Which wireless network?
Password?
It went and got an IP address.
Then updated its firmware.
Then hunted for the Slimserver server which I'd already installed on my Macbook. It just found it!!
And now I can listen to XFM without having to lug my computer to the stereo!
And I love it!
You can tell these guys have learned a thing or two from Apple on design.
The box screams apple,
The setup experience was flawless. It just worked!
Where are you?
Which wireless network?
Password?
It went and got an IP address.
Then updated its firmware.
Then hunted for the Slimserver server which I'd already installed on my Macbook. It just found it!!
And now I can listen to XFM without having to lug my computer to the stereo!
Sunday, March 02, 2008
Choosing a technology for an application
The more work I do around WPF "smart" clients the less I believe they are the future. Maybe it's because I'm working on an application that I truly believe is using the wrong technologies and should be an asp.net application but I miss the freedom I felt writing web apps.
I know there are a bunch of reasons for writing smart-client - offline, being one of them, but I think that reason is starting to look a little shaky given Google Gears... Now if Silverlight lets you run Sql CE (or equivalent) on the client I see that as one more reason not to write chunky fat clients.
I know there are a bunch of reasons for writing smart-client - offline, being one of them, but I think that reason is starting to look a little shaky given Google Gears... Now if Silverlight lets you run Sql CE (or equivalent) on the client I see that as one more reason not to write chunky fat clients.
Using Uri's in CAB
Recently I was thinking about a neat addition to CAB that would allow a user to use a Url to "deep-link" into a CAB application (CAB as that's the technology I use at work).
The way I see it working would be:
Use a pluggable protocol to register my application with explorer.
Create a common url syntax to link a Uri to a Cab event
When the application starts follow one of two paths:
1. If not already running then start up and pass the Url to the Url launcher service.
2. If not already running then open an ipc channel listening locally on port whatever
3. If already running then connect to the ipc channel and supply the url.
Originally I thought that you could use the uri to directly create a CAB work-item. This is impossible to do right though. You don't know where the work-item should live in the hierarchy, if it is single instancing or multiple, or any number of contextual issues. Using a Cab event is bullet-proof though. Raise it globally and the subscriber can choose exactly what they want to do with it.
Nice.
The way I see it working would be:
Use a pluggable protocol to register my application with explorer.
Create a common url syntax to link a Uri to a Cab event
When the application starts follow one of two paths:
1. If not already running then start up and pass the Url to the Url launcher service.
2. If not already running then open an ipc channel listening locally on port whatever
3. If already running then connect to the ipc channel and supply the url.
Originally I thought that you could use the uri to directly create a CAB work-item. This is impossible to do right though. You don't know where the work-item should live in the hierarchy, if it is single instancing or multiple, or any number of contextual issues. Using a Cab event is bullet-proof though. Raise it globally and the subscriber can choose exactly what they want to do with it.
Nice.
Monday, February 25, 2008
Blog reactivated
Wahay,
For some reason my blog was deactivated when I checked it last week. Seems like Google have re-activated it!
For some reason my blog was deactivated when I checked it last week. Seems like Google have re-activated it!
Sunday, May 27, 2007
CAB, SCSF Testability
I came across a class the other week called TestableRootWorkItem. I was put onto it from a post I made on the Smart Client forum, and it can be found in the Appraisal Work Bench test module.
Basically it's a WorkItem which is initialised with a core set of services (of your choosing) and can then be used to test your own CAB code.
Example time - imagine you've a presenter / view combo called ShowCustomersPresenter.
The view implements an interface called IShowCustomersView.
In your test fixture you can use the TestableRootWorkItem a little bit like this:
public void MyTestOfWhatever()
{
TestableRootWorkItem rootItem = new TestableRootWorkItem();
rootItem.Services.AddNew<ICustomerService, MockCustomerService>();
ShowCustomersPresenter presenter = rootItem.Items.AddNew<ShowCustomersPresenter>();
IShowCustomerView mockView = new MockView();
presenter.View = mockView;
presenter.FindCustomers();
Assert.AreEqual(3, mockView.CustomerCount);
}
so, what's going on here then?
Well, we start with adding a mock customer service to the work item.
Next we add an instance of the Presenter we want to test. ObjectBuilder will spot a [ServiceDependency] attribute looking for a service of type ICustomerService and will add my MockCustomerService which has been registered.
The presenter's view is an IShowCustomerView. I don't want to test the real one so have added a MockView class which implements the interface. I have total control over this, but most importantly it's not a UI component.
here is my implementation of these 2 classes:
public class MockCustomerService: ICustomerService
{
public IList<CustomerSearchResult> FindCustomers(string customerName)
{
return new List<CustomerSearchResult>(new CustomerSearchResult[] { ... });
}
}
public class MockView: IShowCustomerView
{
public int CustomerCount = 0;
public ShowCustomers(IList<CustomerSearchResult> results)
{
CustomerCount = results.Count;
}
}
it's pretty plain sailing from here.
I simulate someone clicking the Find button by calling presenter.FindCustomers() directly.
My implementation of the Presenter under the hood calls the ICustomerService service to get the customers, and then calls View.ShowCustomers(results).
Using a well known service, and a mock view I can prove in the test that indeed this is what is happening.
To make it more interesting it's pretty straight forward to test Presenters raising or subscribing to events. You can create a MockEventSubscriber class which uses a CAB [EventSubscription(....)] to check for the raising of an event. The test method just has to add this class directly to the WorkItem (WorkItem.Items.AddNew<MockEventSubscriber>()) and you're there!
CABs loose coupling event plumbing makes it perfect for writing classes that can be tested in isolation. In-fact, I think that if you're not testing CAB code in this way that you're really missing a trick! I'm about to start on the next phase of a CAB project and hope to report back on how it all goes!
That's all for now :o)
Basically it's a WorkItem which is initialised with a core set of services (of your choosing) and can then be used to test your own CAB code.
Example time - imagine you've a presenter / view combo called ShowCustomersPresenter.
The view implements an interface called IShowCustomersView.
In your test fixture you can use the TestableRootWorkItem a little bit like this:
public void MyTestOfWhatever()
{
TestableRootWorkItem rootItem = new TestableRootWorkItem();
rootItem.Services.AddNew<ICustomerService, MockCustomerService>();
ShowCustomersPresenter presenter = rootItem.Items.AddNew<ShowCustomersPresenter>();
IShowCustomerView mockView = new MockView();
presenter.View = mockView;
presenter.FindCustomers();
Assert.AreEqual(3, mockView.CustomerCount);
}
so, what's going on here then?
Well, we start with adding a mock customer service to the work item.
Next we add an instance of the Presenter we want to test. ObjectBuilder will spot a [ServiceDependency] attribute looking for a service of type ICustomerService and will add my MockCustomerService which has been registered.
The presenter's view is an IShowCustomerView. I don't want to test the real one so have added a MockView class which implements the interface. I have total control over this, but most importantly it's not a UI component.
here is my implementation of these 2 classes:
public class MockCustomerService: ICustomerService
{
public IList<CustomerSearchResult> FindCustomers(string customerName)
{
return new List<CustomerSearchResult>(new CustomerSearchResult[] { ... });
}
}
public class MockView: IShowCustomerView
{
public int CustomerCount = 0;
public ShowCustomers(IList<CustomerSearchResult> results)
{
CustomerCount = results.Count;
}
}
it's pretty plain sailing from here.
I simulate someone clicking the Find button by calling presenter.FindCustomers() directly.
My implementation of the Presenter under the hood calls the ICustomerService service to get the customers, and then calls View.ShowCustomers(results).
Using a well known service, and a mock view I can prove in the test that indeed this is what is happening.
To make it more interesting it's pretty straight forward to test Presenters raising or subscribing to events. You can create a MockEventSubscriber class which uses a CAB [EventSubscription(....)] to check for the raising of an event. The test method just has to add this class directly to the WorkItem (WorkItem.Items.AddNew<MockEventSubscriber>()) and you're there!
CABs loose coupling event plumbing makes it perfect for writing classes that can be tested in isolation. In-fact, I think that if you're not testing CAB code in this way that you're really missing a trick! I'm about to start on the next phase of a CAB project and hope to report back on how it all goes!
That's all for now :o)
Sunday, May 06, 2007
CAB / Smart Client Software Factory pointers
I've been involved in a project which is using Microsofts Component Application Block for a few months now and thought I'd drop an entry on CAB 101 - do's and donots!
CAB is heavily based around MVP and the idea of splitting use-cases into a WorkItem. Sounds complicated? Don't let it. A WorkItem is nothing more than a container of things which are required to get the job of a use-case done.
So, a workitem may contain some views, some services, and some logic for co-ordinating them together. Simple huh?
Lets look at a use case of searching for customers.
What views are involved in this? For this example lets say we have a view to enter search text, and a view to show a list of customers.
Get your GUI guys to knock up these 2 views. Make them look blinding! Just hold off on the actual guts of what is going on as it's not their job!
GUI guys working on the views? Great. Let's begin the meaty stuff.
Lets create a class that will hold all of the parts involved in the use-case together. This is will be subclass of WorkItemController.
Override the Run() method on this type. Lets have it create a Search Criteria view and add it as SmartParts to the WorkItem's SmartPart collection.
SearchCriteriaView view = WorkItem.SmartParts.AddNew();
Let's also show this view in the main workspace.
WorkItem.Workspaces[MainWorkspace].Show(view);
Assume that the view has some fields for entering search criteria, and a Search button. When the user clicks on the Search button we'll delegate to our SearchCriteriaViewPresenter class (remember MVP)...
The Presenter for the Search Criteria screen is the thing that will go and find the results. But how does it do this?
This is where we use another piece of CAB goodness - its DependencyInjection framework. CAB will wire up objects we want, setting properties on them by magic. Did I mention that we have already asked CAB to register a CustomerSearch service on our behalf? Nope? Well we did!
In the Search Criteria presenter we'll have some lines that look like this...
[ServiceDependency]
public ICustomerSearch
{
set { _customerSearch = value; }
}
public void Search(....)
{
IList<SearchViewCustomer> customers = _customerSearch.Search(....)
}
But how do we get these results to the results view? This is where CAB's idea of loose coupling comes into play. What we'll do is add the results into the WorkItem's Items Collection and then raise an event to say we've found some search results. The Search method becomes more like this.
[EventPublication("ResultsReturned", PublicationScope.WorkItem)]
public event EventHandler<EventArgs> ResultsReturned;
public void Search(....)
{
IList<SearchViewCustomer> customers = _customerSearch.Search(....)
WorkItem.Items.Add(customers, "CustomerList");
ResultsReturned(this, EventArgs.Empty);
}
Woah! What's going on there. Well the EventPublication line instructs CAB that this class can raise a CAB event. CAB events offer more flexibility over .net events. We can change the scope of who they are raised to. In our case we're going to tell the WorkItem that we've found some results.
Go back to the WorkItemController from earlier and add the following method.
[EventSubscription("ResultsReturned")]
public void OnResultsReturned(object sender, EventArgs e)
{
ResultsView view = WorkItem.SmartParts.AddNew();
WorkItem.Workspaces["MainWindow"].Show(view);
}
Remember that other gui screen that was being prepared? Get into the Presenter and add a constructor.
[InjectionConstructor]
public ResultsViewPresenter(
[ComponentDependency("CustomerList") IList<Customer> customers] )
{
View.Customers = customers;
}
The InjectionConstructor attribute is a Object Builder attribute that will let us easily inject data into the new Presenter. In this case we are telling builder that the constructor is dependent on an item called CustomerList. It will look for this item in the Items collection and pass it to the constructor for us.
All we have to do is bind the customers list to the view.
Recap! What have we achieved?
We've created 2 smart parts which act together to perform the use case of finding customers.
W've created a WorkItemController which will hold these 2 views giving us a context for working with just the 2 views loosely without them knowing about each other.
We've used a CAB Event to tell anyone interested that we found some customers.
We used CAB's Items collection to share the customers between 2 views without either of them being aware of each other.
And we used the dependency injection system to obtain a reference to a service, and to wire up a Presenter.
Not bad for 10 minutes work!
CAB is heavily based around MVP and the idea of splitting use-cases into a WorkItem. Sounds complicated? Don't let it. A WorkItem is nothing more than a container of things which are required to get the job of a use-case done.
So, a workitem may contain some views, some services, and some logic for co-ordinating them together. Simple huh?
Lets look at a use case of searching for customers.
What views are involved in this? For this example lets say we have a view to enter search text, and a view to show a list of customers.
Get your GUI guys to knock up these 2 views. Make them look blinding! Just hold off on the actual guts of what is going on as it's not their job!
GUI guys working on the views? Great. Let's begin the meaty stuff.
Lets create a class that will hold all of the parts involved in the use-case together. This is will be subclass of WorkItemController.
Override the Run() method on this type. Lets have it create a Search Criteria view and add it as SmartParts to the WorkItem's SmartPart collection.
SearchCriteriaView view = WorkItem.SmartParts.AddNew
Let's also show this view in the main workspace.
WorkItem.Workspaces[MainWorkspace].Show(view);
Assume that the view has some fields for entering search criteria, and a Search button. When the user clicks on the Search button we'll delegate to our SearchCriteriaViewPresenter class (remember MVP)...
The Presenter for the Search Criteria screen is the thing that will go and find the results. But how does it do this?
This is where we use another piece of CAB goodness - its DependencyInjection framework. CAB will wire up objects we want, setting properties on them by magic. Did I mention that we have already asked CAB to register a CustomerSearch service on our behalf? Nope? Well we did!
In the Search Criteria presenter we'll have some lines that look like this...
[ServiceDependency]
public ICustomerSearch
{
set { _customerSearch = value; }
}
public void Search(....)
{
IList<SearchViewCustomer> customers = _customerSearch.Search(....)
}
But how do we get these results to the results view? This is where CAB's idea of loose coupling comes into play. What we'll do is add the results into the WorkItem's Items Collection and then raise an event to say we've found some search results. The Search method becomes more like this.
[EventPublication("ResultsReturned", PublicationScope.WorkItem)]
public event EventHandler<EventArgs> ResultsReturned;
public void Search(....)
{
IList<SearchViewCustomer> customers = _customerSearch.Search(....)
WorkItem.Items.Add(customers, "CustomerList");
ResultsReturned(this, EventArgs.Empty);
}
Woah! What's going on there. Well the EventPublication line instructs CAB that this class can raise a CAB event. CAB events offer more flexibility over .net events. We can change the scope of who they are raised to. In our case we're going to tell the WorkItem that we've found some results.
Go back to the WorkItemController from earlier and add the following method.
[EventSubscription("ResultsReturned")]
public void OnResultsReturned(object sender, EventArgs e)
{
ResultsView view = WorkItem.SmartParts.AddNew
WorkItem.Workspaces["MainWindow"].Show(view);
}
Remember that other gui screen that was being prepared? Get into the Presenter and add a constructor.
[InjectionConstructor]
public ResultsViewPresenter(
[ComponentDependency("CustomerList") IList<Customer> customers] )
{
View.Customers = customers;
}
The InjectionConstructor attribute is a Object Builder attribute that will let us easily inject data into the new Presenter. In this case we are telling builder that the constructor is dependent on an item called CustomerList. It will look for this item in the Items collection and pass it to the constructor for us.
All we have to do is bind the customers list to the view.
Recap! What have we achieved?
We've created 2 smart parts which act together to perform the use case of finding customers.
W've created a WorkItemController which will hold these 2 views giving us a context for working with just the 2 views loosely without them knowing about each other.
We've used a CAB Event to tell anyone interested that we found some customers.
We used CAB's Items collection to share the customers between 2 views without either of them being aware of each other.
And we used the dependency injection system to obtain a reference to a service, and to wire up a Presenter.
Not bad for 10 minutes work!
So long England, hello Australia!
Well it's been a while since I last wrote a blog entry but I have decided to start up again for no particular reason!
I'll probably keep it quite techie this time though. I'm currently working on a WPF / CAB project so I might drop some entries from time to time about these technologies.
I'll probably keep it quite techie this time though. I'm currently working on a WPF / CAB project so I might drop some entries from time to time about these technologies.
Friday, August 26, 2005
What part of cancelled don't you understand
Just over two weeks ago my wife had the misfortune of having her wallet stolen which contained a bit of cash and a debit card.
It wasn't long before she noticed and I called the bank for her to cancel the debit card. I walked through the transactions which had occurred that day, all which were bona-fide attributed to her, and the card was duly cancelled.
It was a bit disturbing to find last night £1300 of transactions, dated a week later, for train tickets (GNER, Virgin) from Euston station each for £280 - £350 (now that's a HELL of a lot of money for one train ticket but 1st class can be that expensive in the UK).
So being very, very alarmed my wife phoned up the bank (a big global world bank who shall rename nameless) and was routed to the call centre in some other country in the world. She was told that the transactions had occurred the night the card was stolen, and most likely in the window between it being stolen and being cancelled. Alarm bells started ringing - am I protected, will I be re-imbursed for what is a months salary, etc, but she were told nothing could be done that night and se'd have to call customer service the next morning.
So, 8am and the call to customer service. Again, nothing could be done but the transactions had been authorised on the Friday night when the card was stolen. She was bounced to the fraud department. Here's where things started getting ridiculous:
Aside from that, here is the bit I love most of all -
The transactions that occurred on the Friday night occurred at 9:30pm. But how can that be? The card was registered stolen at 8:30pm. Well here is the icing on the cake.
Am I surprised credit / debit card fraud is massively increaing???? Not on your life. If registering a card as stolen doesn't actually stop it being used then what chance is there of this sort of fraud being stopped?
It wasn't long before she noticed and I called the bank for her to cancel the debit card. I walked through the transactions which had occurred that day, all which were bona-fide attributed to her, and the card was duly cancelled.
It was a bit disturbing to find last night £1300 of transactions, dated a week later, for train tickets (GNER, Virgin) from Euston station each for £280 - £350 (now that's a HELL of a lot of money for one train ticket but 1st class can be that expensive in the UK).
- Interestin point 1 - the account was close to zero when the card was stolen and had a £500 overdraft. How come £1300 of transactions was
- allowed
- didn't register as a strange spending pattern even though said bank claims to have state of the art transaction pattern monitoring systems.
So being very, very alarmed my wife phoned up the bank (a big global world bank who shall rename nameless) and was routed to the call centre in some other country in the world. She was told that the transactions had occurred the night the card was stolen, and most likely in the window between it being stolen and being cancelled. Alarm bells started ringing - am I protected, will I be re-imbursed for what is a months salary, etc, but she were told nothing could be done that night and se'd have to call customer service the next morning.
So, 8am and the call to customer service. Again, nothing could be done but the transactions had been authorised on the Friday night when the card was stolen. She was bounced to the fraud department. Here's where things started getting ridiculous:
- The fraud department couldn't help and suggested she went into a branch. Now call me stupid but isn't a fraud department supposed to deal with fraud.
- Ridiculous suggestion 1: Said bank offered to increase her overdraft to help her get through the month. Great idea - not content with letting someone spend £1300 from an account with a £500 overdraft they now want to push the limit up so she can bring her account even more into the red.
Aside from that, here is the bit I love most of all -
The transactions that occurred on the Friday night occurred at 9:30pm. But how can that be? The card was registered stolen at 8:30pm. Well here is the icing on the cake.
- EACH TRANSACTION WAS MARKED WITH "INCORRECT ISSUE NUMBER ON CARD"
- A card is stolen, registered as stolen, but then £1300 of transactions are allowed even though the system at some point knows that this card is not supposed to be used.
Am I surprised credit / debit card fraud is massively increaing???? Not on your life. If registering a card as stolen doesn't actually stop it being used then what chance is there of this sort of fraud being stopped?
Tuesday, June 14, 2005
Live 8 & Ebay
Hmm, did nobody envisage this happening?
I've been speculating since the tkx were announced that there would be a flood of people trying to sell their tickets on eBay as soon as they got them!
That's just the state of the world we live in today. Too many people who want to make a quick buck for doing nothing at-all.
Sorry Bob, cry all you like but maybe you should have learned the Glastonbury lesson which is to print security into the tickets and make sure whoevers name is on, is at the gate.
(For the record I think it's a terrible situation that people are doing this, and if I had a pair I wouldn't think of it. It's my 30th birthday tho' so I'm having a party instead!!)
I've been speculating since the tkx were announced that there would be a flood of people trying to sell their tickets on eBay as soon as they got them!
That's just the state of the world we live in today. Too many people who want to make a quick buck for doing nothing at-all.
Sorry Bob, cry all you like but maybe you should have learned the Glastonbury lesson which is to print security into the tickets and make sure whoevers name is on, is at the gate.
(For the record I think it's a terrible situation that people are doing this, and if I had a pair I wouldn't think of it. It's my 30th birthday tho' so I'm having a party instead!!)
Friday, May 20, 2005
Grease Monkey
This is a neat add-in for google maps. Install grease monkey into firefox, and then this little add-in to make your mouse wheel control the zoom slide bar.
For real power addicts download Nasa's World Wind. Very, very cool! Even my wife agreed and she is not a techy fan!
For real power addicts download Nasa's World Wind. Very, very cool! Even my wife agreed and she is not a techy fan!
Smoking - the solution
How socially unacceptable is this habit. Last night at the Moby gig (Brixton Academy) I got sick to death of people blowing smoke in my face.
I propose a compulsory attachment to cigarettes which forces all smoke back into the lungs of the smoker. Lets see how many people carry on with that.
Also non-smoking areas in restaurants. What's the point. You're still only 5 metres from smokers.
And, even worse - the smokers who won't smoke when they are eating, but light up as soon as they've finished even though I, the non smoker, am sat on the next table - and then are really annoyed when you point this out to them and ask them to put it out. What a selfish race of people they are.
If you want to smoke then by all means do - just don't expect me to breathe your smoke in. You choose to smoke it, so you should have it all, to yourself... My gift to you. I'm kind like that.
I propose a compulsory attachment to cigarettes which forces all smoke back into the lungs of the smoker. Lets see how many people carry on with that.
Also non-smoking areas in restaurants. What's the point. You're still only 5 metres from smokers.
And, even worse - the smokers who won't smoke when they are eating, but light up as soon as they've finished even though I, the non smoker, am sat on the next table - and then are really annoyed when you point this out to them and ask them to put it out. What a selfish race of people they are.
If you want to smoke then by all means do - just don't expect me to breathe your smoke in. You choose to smoke it, so you should have it all, to yourself... My gift to you. I'm kind like that.
Twisting tale
So things have moved on a little bit.
- The "spec-changing" job is now dead and buried and good riddance to it.
- The 3 interviews job are now aware that I've turned down previous job and am not pushing for an answer any more (this is a very good move as I don't want to hurry them).
- A 3rd job has surfaced, this time down in Docklands. I should have an interview on Monday with them.
Unbelievable
I feel like I've been kicked in the guts. I got offered one of the jobs that I interviewed for on Wednesday.
The spec was for a c# / asp.net developer, the interview was as-well. The offer was for the very same job... Until today that is when the manager decided to alter the job to a VB6 COM role. Is that legal? It shouldn't be! I'm still a bit shocked for the audacity of someone to do such a thing.
Needless to say the job has been immediately turned down so I'm pinning my (diminishing) hopes on the other job that I've had 3 interviews for.
Looks like Sicily could be spent in and out of internet cafes applying for jobs. Wonderful.
The spec was for a c# / asp.net developer, the interview was as-well. The offer was for the very same job... Until today that is when the manager decided to alter the job to a VB6 COM role. Is that legal? It shouldn't be! I'm still a bit shocked for the audacity of someone to do such a thing.
Needless to say the job has been immediately turned down so I'm pinning my (diminishing) hopes on the other job that I've had 3 interviews for.
Looks like Sicily could be spent in and out of internet cafes applying for jobs. Wonderful.
Subscribe to:
Posts (Atom)