Breaking Changes in Xafari 15.1.308.217
General Information
Recent Posts
- Faster analysis with OLAP, basic technical terms and how they are related to each other
- Development prospects for Ranet OLAP Technology using Artificial Intelligence
- OLAP: outdated technology or a modern trend in the development of business intelligence platforms?
- OLAP technology in BI solutions
- Xafari Framework hot price
New Major Features in x08
Enhancements and Updates
To learn about new features/updates and resolved issues in this version, please refer to the following page:
What's New in Xafari 15.1.308.217
Known Issues
To learn about known issues in this version, please refer to the following page:
Known Issues in Xafari 15.1.308.217
Breaking Changes
Flow
ModelDifferencesDb
Numerators
- Now numerators is based on XafariService (see Documentation).
- Some methods have been removed or signatures were changed:
class Xafari.BC.Numerators.NumeratorBase
- – void SaveDeletedNumber(object, long) -> void SaveDeletedNumber(object, Nullable<long>)
class Xafari.BC.Numerators.IDeletedNumbersSupport
- – long GetRealIndex(NumeratorBase, string) -> Nullable<long> GetRealIndex(NumeratorBase, string)
- – void SetRealIndex(NumeratorBase, string, long) -> void SetRealIndex(NumeratorBase, string, Nullable<long>)
class Xafari.BC.Numerators.INumeratorPersistenceProvider
- – TypeInfo GetNumeratorValueType() -> ITypeInfo GetNumeratorValueType()
class Xafari.BC.Numerators.NumeratorFormatter
- – void NumeratorFormatter(NumeratorBase) -> void NumeratorFormatter(ServiceSpaceContext, NumeratorBase)
class Xafari.BC.Numerators.NumeratorLink
- – void NumeratorLink(NumeratorBase, Type, string) – Delete
- – void NumeratorLink(NumeratorBase, Type, string, Nullable<int>) -> void NumeratorLink(NumeratorBase, Type, string, Nullable<int>, ApplyNumeratorsStrategy)
class Xafari.BC.Numerators.NumeratorManager
- – void AddNumerator(NumeratorBase) -> NumeratorManager AddNumerator(NumeratorBase)
- – void AddLink(NumeratorLink) -> NumeratorManager AddLink(NumeratorLink)
- – void SaveDeletedNumbers(object) – Delete
- – long GetRealIndex(object, NumeratorBase, string) – Delete
- – IObjectSpace CreateObjectSpace() – Delete
- – XafApplication Application – Delete
- – NumeratorManager Instance – Delete
class Xafari.BC.Numerators.Model.Extensions
- – IModelBCNumerators XafariBCNumerators(IModelApplication) – Delete
- 3. Enumeration Xafari.BC.Numerators.ApplyNumeratorsStrategy has been added in the numerator settings in the application model. You can use it to control numerators applying strategy.
- class Xafari.BC.Numerators.Model.IModelNumerators
– public ApplyNumeratorsStrategy DefaultApplyStrategy – New - class Xafari.BC.Numerators.Model.IModelNumeratorLink
– public ApplyNumeratorsStrategy ApplyStrategy – New
- class Xafari.BC.Numerators.Model.IModelNumerators
Application Settings
- When you work with settings in the application you have the capability to save or to rollback changes.
- To attach the AppSettings module you can just add it to modules list. All needed settings is done by default.
– Use case with standard layers structure (Root->Users)
You need to upgrade existing project and do the following:
- Find in the source code of platform-independent module or in the AppModule code for settings initialization and delete it.
For example, you have the code like thisvoid application_SetupComplete(object sender, EventArgs e) { if (this.Application.IsSharedApplication()) return; SettingsAccessor.Instance = new BCDemoSettingsAccessor((XafApplication)sender); }
It should looks like this:
void application_SetupComplete(object sender, EventArgs e) { if (this.Application.IsSharedApplication()) return; }
- Find in the source code of platform-independent module or in the AppModule code for current layer settings initialization and delete it.
For example, you have the code like thispublic override void Setup(XafApplication application) { base.Setup(application); application.SettingUp += (sender, args) => { if (this.Application.IsSharedApplication()) return; this.Application.LoggedOn += (o, eventArgs) => { SettingsAccessor.Instance.CurrentSlice = SettingsAccessor.Instance.GetSlice(SecuritySystem.CurrentUser); NumeratorManager.Instance.PersistenceProvider = new DCNumeratorPersistenceProvider(); }; }; application.SetupComplete += application_SetupComplete; }
It should looks like this:
public override void Setup(XafApplication application) { base.Setup(application); application.SettingUp += (sender, args) => { if (this.Application.IsSharedApplication()) return; this.Application.LoggedOn += (o, eventArgs) => { NumeratorManager.Instance.PersistenceProvider = new DCNumeratorPersistenceProvider(); }; }; application.SetupComplete += application_SetupComplete; }
- One more example
You have the code:void Application_LoggedOn(object sender, LogonEventArgs e) { var application = sender as XafApplication; if (application == null) return; if (SettingsAccessor.Instance != null) return; SettingsAccessor.Instance = new NorthwindSettingsAccessor(application); if (SecuritySystem.CurrentUser != null) SettingsAccessor.Instance.CurrentSlice = SettingsAccessor.Instance.GetSlice(((InheritedUser)SecuritySystem.CurrentUser).Department, SecuritySystem.CurrentUser); }
It should looks like this:
void Application_LoggedOn(object sender, LogonEventArgs e) { var application = sender as XafApplication; if (application == null) return; }
Use case with non-typical layers structure.
(see example from Xafari.Northwind project which shipped with installer)
You need to upgrade existing project and do the following:
- Find in the source code of platform-independent module or in the AppModule code for settings initialization and change it by example below.
You have the code:void Application_LoggedOn(object sender, LogonEventArgs e) { var application = sender as XafApplication; if (application == null) return; if (SettingsAccessor.Instance != null) return; SettingsAccessor.Instance = new NorthwindSettingsAccessor(application); if (SecuritySystem.CurrentUser != null) SettingsAccessor.Instance.CurrentSlice = SettingsAccessor.Instance.GetSlice(((InheritedUser)SecuritySystem.CurrentUser).Department, SecuritySystem.CurrentUser); }
It should looks like this:
void Application_LoggedOn(object sender, LogonEventArgs e) { var application = sender as XafApplication; if (application == null) return; if (SettingsAccessor.Instance != null) return; SettingsAccessor.Instance = new NorthwindSettingsAccessor(); SettingsAccessor.Instance.Setup(application); if (SecuritySystem.CurrentUser != null) SettingsAccessor.Instance.ObjectSpace.AppSettings().CurrentSlice(((InheritedUser) SecuritySystem.CurrentUser).Department, SecuritySystem.CurrentUser); }
- If you implemented your own SettingsAccessor you also need to make changes in it. Now the description of layers structure implements in the Setup method.
Here is the code before.public class NorthwindSettingsAccessor : SettingsAccessor { public NorthwindSettingsAccessor(XafApplication application) : base(application) { this.RootSlice = new NorthwindSettingsDefaultValueSlice(); this.SliceTypes = new[] { typeof (NorthwindSettingsDepartment), typeof (NorthwindSettingsInheritedUser), }; } }
Here is the code after.
public class NorthwindSettingsAccessor : SettingsAccessor { public override void Setup(XafApplication application) { base.Setup(application); this.CreateRootSlice<NorthwindSettingsDefaultValueSlice>(); this.SliceTypes = new[] { typeof (NorthwindSettingsDepartment), typeof (NorthwindSettingsInheritedUser), }; } }
Reports
- public virtual IDataMinerOperation CreateDataMinerInstance() -> public IDataMinerOperation CreateDataMinerInstance(IObjectSpace, XafariReportParametersBase)
- public static IDataMinerOperation CreateDataMinerInstance(string) -> public static IDataMinerOperation CreateDataMinerInstance(string, IObjectSpace, XafariReportParametersBase)
- public static IDataMinerOperation CreateDataMinerInstance(IModelXafariReport) -> public static IDataMinerOperation CreateDataMinerInstance(IModelXafariReport, IObjectSpace, XafariReportParametersBase)
- public static XafariReportDataSourceBase CreateDataSourceInstance(IModelXafariReport) -> public static XafariReportDataBase CreateDataSourceInstance(IModelXafariReport)
If you want to implement template designer, you need to create descendant class of Xafari.Reports.UI.ReportTemplateDesigner<TReportTemplate> and implement the method
public abstract void ShowDesigner(TReportTemplate template, Controller controller, ShowViewParameters showViewParameters)
The designer is registering automatically.
Now this method does not return a value. The layout data are stored in the property Content of Xafari.Reports.Xaf.XafXafariReportTemplate.
public XtraReport ReportEngine
Now class XtraReport is used to build report.
Security
Use Xafari.Security.XafariSecurityManager.Instance instead. The method XafariSecurityManager.Instance.FindRole(IObjectSpace objectSpace, string roleName) has been added.
Xafari
Xafari.MQ
- Xafari.Server.IMessageHandler.OnCompleted has been renamed to Completed
- Xafari.Server.IMessageHandler.OnStartedThread has been renamed to ThreadStarted
- Xafari.Server.IMessageHandler.OnStoppedThread has been renamed to ThreadStopped
Xafari.XF (eXtension Framework)
The module that contains entities and extensions must implement the interface Xafari.XF.IXFRegistrator.
Registration is performed using RegisterEntity and RegisterExtension.
Example:
void IXFRegistrator.RegisterXF(Xafari.EntityFactory entityFactory) { // Entity this.RegisterEntity<Entity1>(); this.RegisterEntity<RefToEntity1>(); // Entity & Extension this.RegisterEntity<XEntity1_Ext1>() .RegisterEntity<Ext1ListItem>() .RegisterEntity<Entity2>() .RegisterExtension<Entity1, XEntity1_Ext1>(a => a.Ext1(), b => b.Entity1()) .RegisterExtension<Entity1, XEntity1_Ext2>(a => a.Ext2(), b => b.Entity1()) .RegisterExtension<Entity1, XEntity1_Ext3>(a => a.Ext3(), b => b.Entity1()); }